Public record
Software health reportschema 0.23.0 · metrics 1.13.0 · 2026-07-21 18:35 UTC

JerrettDavis / ExperimentFramework

.NET framework for A/B testing, feature flags, trial fallback, and observability.

C#MIT★ 1 star⑂ 1 forksince Dec 2025View on GitHub ↗

JerrettDavis/ExperimentFramework holds a health index of 64 out of 100, placing it in the Moderate band. It scores highest on Vitality (83/100) and lowest on Community & Adoption (35/100). It was last updated today. A single contributor accounts for most of its recent work.

64
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

64
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

JD DavisPersonal account
155 followers125 public repossince Oct 2012

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

83Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
13.8/36Commit cadence — 20/52 weeks with commits
18/18Commit volume — 135 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year135
human_commit_share0.67
days_since_last_push0
active_weeks_last_year20
How it's scored
27/27Ships releases — 60 releases published
36/36Release recency — latest release 0 days ago
27/27Release cadence — a release every ~4 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count60
latest_release_tagv0.23.12
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases4

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

35At risk · 18% of overall
How it's scored
0/60Stars — 1 stars
0/25Forks — 1 forks
0/15Watchers — 0 watchers
Inputs used
forks1
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
6.3/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateyes
How it's scored
45.7/80Total downloads — 24,817 downloads all-time across nuget
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesExperimentFramework.Dashboard, ExperimentFramework.DataPlane, ExperimentFramework.Diagnostics, ExperimentFramework.Dashboard.UI, ExperimentFramework.Configuration, ExperimentFramework.Dashboard.Api, ExperimentFramework.Dashboard.Abstractions, ExperimentFramework.DataPlane.Abstractions
dependents
ecosystemsnuget
total_downloads24,817
monthly_downloads
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

60Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
46.8/46.8Issue resolution — 100% of issues closed
37.5/38.3PR acceptance — 95/97 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/8 approved changesets -- score normalized to 0
Inputs used
merged_prs95
open_issues0
closed_issues17
issue_closed_ratio1
closed_unmerged_prs2
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
15.8/25Owner reach — 155 followers of JerrettDavis
25/25Track record — 125 public repos, account ~13 yr old
Inputs used
followers155
owner_typeUser
is_verified
owner_loginJerrettDavis
public_repos125
account_age_days5,021
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 8 package(s) on nuget
35/35Publish recency — latest publish 0 days ago
20/20Version history — 51 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesExperimentFramework.Dashboard, ExperimentFramework.DataPlane, ExperimentFramework.Diagnostics, ExperimentFramework.Dashboard.UI, ExperimentFramework.Configuration, ExperimentFramework.Dashboard.Api, ExperimentFramework.Dashboard.Abstractions, ExperimentFramework.DataPlane.Abstractions
ecosystemsnuget
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

81Good · 20% of overall
How it's scored
24/24CI workflows — 9 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 23 out of 23 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

100Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://jerrettdavis.github.io/ExperimentFramework/
10/10Repository description
10/10Topics — 7 topics
10/10Wiki
Inputs used
topicsab-testing, csharp, dotnet, experimentation, feature-flags, nuget, observability
has_wikiyes
homepagehttps://jerrettdavis.github.io/ExperimentFramework/
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

58Moderate · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 23 out of 23 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/8 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
4.5/5SAST — SAST tool detected but not run on all commits
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 14 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4.7
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
0/25Indirect dependencies free of known advisories — transitive set not separable from development and test dependencies in this scope
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages139
unassessed_packages2
affected_by_severitynone
direct_affected_packages0
Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 139 resolved dependencies against OSV. 2 could not be assessed — no resolved version, an unsupported ecosystem, or beyond the reported package list. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score.

76Good · 0% of overall
How it's scored
45/45Agent instructions — CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 67 of 67 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes10,836
How it's scored
12.6/18One-command bootstrap — benchmarks/ExperimentFramework.Benchmarks/ExperimentFramework.Benchmarks.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.ApiService/AspireDemo.ApiService.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.AppHost/AspireDemo.AppHost.csproj (toolchain convention, no task runner)
22/22Automated tests
0/11Lint / format config
11/11Static type checking — C# (statically typed)
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 44 of the last 100 commits agent-authored or agent-credited
8/8Automated maintenance — 29 of the last 100 commits are automated dependency updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilespackages.lock.json
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0.44
toolchain_manifestsbenchmarks/ExperimentFramework.Benchmarks/ExperimentFramework.Benchmarks.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.ApiService/AspireDemo.ApiService.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.AppHost/AspireDemo.AppHost.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Contracts/AspireDemo.Blog.Contracts.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Auth/AspireDemo.Blog.Plugins.Auth.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Data/AspireDemo.Blog.Plugins.Data.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Editor/AspireDemo.Blog.Plugins.Editor.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Syndication/AspireDemo.Blog.Plugins.Syndication.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.Blog/AspireDemo.Blog.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.E2ETests/AspireDemo.E2ETests.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.ServiceDefaults/AspireDemo.ServiceDefaults.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.Web.Tests/AspireDemo.Web.Tests.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.Web/AspireDemo.Web.csproj, samples/ExperimentFramework.BanditOptimizer/ExperimentFramework.BanditOptimizer.csproj, samples/ExperimentFramework.ComprehensiveSample/ExperimentFramework.ComprehensiveSample.csproj, samples/ExperimentFramework.DashboardHost/ExperimentFramework.DashboardHost.csproj, samples/ExperimentFramework.DataPlaneSample/ExperimentFramework.DataPlaneSample.csproj, samples/ExperimentFramework.FeatureFlagDemo/ExperimentFramework.FeatureFlagDemo.csproj, samples/ExperimentFramework.GovernanceSample/ExperimentFramework.GovernanceSample.csproj, samples/ExperimentFramework.OpenTelemetryDataPlaneSample/ExperimentFramework.OpenTelemetryDataPlaneSample.csproj, samples/ExperimentFramework.PluginHostSample/ExperimentFramework.PluginHostSample.csproj, samples/ExperimentFramework.ResilienceDemo/ExperimentFramework.ResilienceDemo.csproj, samples/ExperimentFramework.SampleConsole/ExperimentFramework.SampleConsole.csproj, samples/ExperimentFramework.SamplePlugin/ExperimentFramework.SamplePlugin.csproj, samples/ExperimentFramework.SampleWebApp/ExperimentFramework.SampleWebApp.csproj, samples/ExperimentFramework.SchemaStampingSample/ExperimentFramework.SchemaStampingSample.csproj, samples/ExperimentFramework.ScientificDemo/ExperimentFramework.ScientificDemo.csproj, samples/ExperimentFramework.ScientificSample/ExperimentFramework.ScientificSample.csproj, samples/ExperimentFramework.SimulationSample/ExperimentFramework.SimulationSample.csproj, src/ExperimentFramework.Admin/ExperimentFramework.Admin.csproj, src/ExperimentFramework.Audit/ExperimentFramework.Audit.csproj, src/ExperimentFramework.AutoStop/ExperimentFramework.AutoStop.csproj, src/ExperimentFramework.Bandit/ExperimentFramework.Bandit.csproj, src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj, src/ExperimentFramework.Dashboard.Abstractions/ExperimentFramework.Dashboard.Abstractions.csproj, src/ExperimentFramework.Dashboard.Analytics/ExperimentFramework.Dashboard.Analytics.csproj, src/ExperimentFramework.Dashboard.Api/ExperimentFramework.Dashboard.Api.csproj, src/ExperimentFramework.Dashboard.UI/ExperimentFramework.Dashboard.UI.csproj, src/ExperimentFramework.Dashboard/ExperimentFramework.Dashboard.csproj, src/ExperimentFramework.Data/ExperimentFramework.Data.csproj, src/ExperimentFramework.DataPlane.Abstractions/ExperimentFramework.DataPlane.Abstractions.csproj, src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj, src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj, src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj, src/ExperimentFramework.DataPlane/ExperimentFramework.DataPlane.csproj, src/ExperimentFramework.Diagnostics/ExperimentFramework.Diagnostics.csproj, src/ExperimentFramework.Distributed.Redis/ExperimentFramework.Distributed.Redis.csproj, src/ExperimentFramework.Distributed/ExperimentFramework.Distributed.csproj, src/ExperimentFramework.FeatureManagement/ExperimentFramework.FeatureManagement.csproj, src/ExperimentFramework.Generators/ExperimentFramework.Generators.csproj, src/ExperimentFramework.Governance.Persistence.Redis/ExperimentFramework.Governance.Persistence.Redis.csproj, src/ExperimentFramework.Governance.Persistence.Sql/ExperimentFramework.Governance.Persistence.Sql.csproj, src/ExperimentFramework.Governance.Persistence/ExperimentFramework.Governance.Persistence.csproj, src/ExperimentFramework.Governance/ExperimentFramework.Governance.csproj, src/ExperimentFramework.Metrics.Exporters/ExperimentFramework.Metrics.Exporters.csproj, src/ExperimentFramework.OpenFeature/ExperimentFramework.OpenFeature.csproj, src/ExperimentFramework.Plugins.Generators/ExperimentFramework.Plugins.Generators.csproj, src/ExperimentFramework.Plugins/ExperimentFramework.Plugins.csproj, src/ExperimentFramework.Resilience/ExperimentFramework.Resilience.csproj, src/ExperimentFramework.Rollout/ExperimentFramework.Rollout.csproj, src/ExperimentFramework.Science/ExperimentFramework.Science.csproj, src/ExperimentFramework.Simulation/ExperimentFramework.Simulation.csproj, src/ExperimentFramework.StickyRouting/ExperimentFramework.StickyRouting.csproj, src/ExperimentFramework.Targeting/ExperimentFramework.Targeting.csproj, src/ExperimentFramework.Testing/ExperimentFramework.Testing.csproj, src/ExperimentFramework/ExperimentFramework.csproj, tests/ExperimentFramework.Audit.Tests/ExperimentFramework.Audit.Tests.csproj, tests/ExperimentFramework.Cli.Tests/ExperimentFramework.Cli.Tests.csproj, tests/ExperimentFramework.Dashboard.Api.Tests/ExperimentFramework.Dashboard.Api.Tests.csproj, tests/ExperimentFramework.Dashboard.Tests/ExperimentFramework.Dashboard.Tests.csproj, tests/ExperimentFramework.Dashboard.UI.Tests/ExperimentFramework.Dashboard.UI.Tests.csproj, tests/ExperimentFramework.DataPlane.AzureServiceBus.Tests/ExperimentFramework.DataPlane.AzureServiceBus.Tests.csproj, tests/ExperimentFramework.DataPlane.Kafka.Tests/ExperimentFramework.DataPlane.Kafka.Tests.csproj, tests/ExperimentFramework.DataPlane.SqlServer.Tests/ExperimentFramework.DataPlane.SqlServer.Tests.csproj, tests/ExperimentFramework.DataPlane.Tests/ExperimentFramework.DataPlane.Tests.csproj, tests/ExperimentFramework.Diagnostics.Tests/ExperimentFramework.Diagnostics.Tests.csproj, tests/ExperimentFramework.E2E.Tests/ExperimentFramework.E2E.Tests.csproj, tests/ExperimentFramework.Generators.Tests/ExperimentFramework.Generators.Tests.csproj, tests/ExperimentFramework.Governance.Persistence.Redis.Tests/ExperimentFramework.Governance.Persistence.Redis.Tests.csproj, tests/ExperimentFramework.Governance.Persistence.Sql.Tests/ExperimentFramework.Governance.Persistence.Sql.Tests.csproj, tests/ExperimentFramework.Governance.Persistence.Tests/ExperimentFramework.Governance.Persistence.Tests.csproj, tests/ExperimentFramework.Governance.Tests/ExperimentFramework.Governance.Tests.csproj, tests/ExperimentFramework.Metrics.Exporters.Tests/ExperimentFramework.Metrics.Exporters.Tests.csproj, tests/ExperimentFramework.Plugins.Generators.Tests/ExperimentFramework.Plugins.Generators.Tests.csproj, tests/ExperimentFramework.Plugins.TestFixtures/ExperimentFramework.Plugins.TestFixtures.csproj, tests/ExperimentFramework.Plugins.Tests/ExperimentFramework.Plugins.Tests.csproj, tests/ExperimentFramework.Simulation.Tests/ExperimentFramework.Simulation.Tests.csproj, tests/ExperimentFramework.StickyRouting.Tests/ExperimentFramework.StickyRouting.Tests.csproj, tests/ExperimentFramework.Testing.Tests/ExperimentFramework.Testing.Tests.csproj, tests/ExperimentFramework.Tests/ExperimentFramework.Tests.csproj, tools/ExperimentFramework.Cli/ExperimentFramework.Cli.csproj, tools/ExperimentFramework.SchemaGenerator/ExperimentFramework.SchemaGenerator.csproj
dependency_bot_commit_share0.29
How it's scored
45/45Type-checkable code — C# (statically typed)
54.9/55Manageable file sizes — 1/864 source files over 60KB
Inputs used
primary_languageC#
largest_source_bytes114,883
source_files_sampled864
oversized_source_files1
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — demos, samples
Inputs used
example_dirsdemos, samples
has_mcp_signalno
api_schema_files

Key facts

1GitHub stars
1contributors
135commits, last 12 months
0days since last push
60releases
1bus factor
0open issues
package ecosystems

More detail

Star and fork history 1 ★ / 1 ⇿
1Stars
1Forks
1Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

0001111112026-012026-012026-01
Major 0Minor 0Patch 1
OpenSSF Scorecard 4.7 / 10
4.7aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-21 18:35 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests23 out of 23 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/8 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
9SASTSAST tool detected but not run on all commits
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities14 existing vulnerabilities detected
Direct dependencies 45
RegistryPackageVersion constraintManifest
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.Audit/ExperimentFramework.Audit.csproj
NuGetMicrosoft.Extensions.Logging.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.Audit/ExperimentFramework.Audit.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.AutoStop/ExperimentFramework.AutoStop.csproj
NuGetMicrosoft.Extensions.Hosting.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.AutoStop/ExperimentFramework.AutoStop.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.Bandit/ExperimentFramework.Bandit.csproj
NuGetMicrosoft.Extensions.Configuration$(MicrosoftExtensionsVersion)src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj
NuGetMicrosoft.Extensions.Configuration.Binder$(MicrosoftExtensionsVersion)src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj
NuGetMicrosoft.Extensions.FileProviders.Physical$(MicrosoftExtensionsVersion)src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj
NuGetMicrosoft.Extensions.Hosting.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj
NuGetMicrosoft.Extensions.Logging.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj
NuGetMicrosoft.Extensions.Options$(MicrosoftExtensionsVersion)src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj
NuGetYamlDotNet16.3.0src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj
NuGetMicrosoft.AspNetCore.Http.Abstractions2.3.9src/ExperimentFramework.Dashboard.Abstractions/ExperimentFramework.Dashboard.Abstractions.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.Data/ExperimentFramework.Data.csproj
NuGetAzure.Messaging.ServiceBus7.20.1src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj
NuGetMicrosoft.Extensions.Logging.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj
NuGetMicrosoft.Extensions.Options$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj
NuGetConfluent.Kafka2.12.0src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj
NuGetMicrosoft.Extensions.Logging.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj
NuGetMicrosoft.Extensions.Options$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj
NuGetMicrosoft.EntityFrameworkCore8.0.11src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.EntityFrameworkCore.Design8.0.11src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.EntityFrameworkCore.SqlServer8.0.11src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.EntityFrameworkCore9.0.0src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.EntityFrameworkCore.Design9.0.0src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.EntityFrameworkCore.SqlServer9.0.0src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.EntityFrameworkCore10.0.1src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.EntityFrameworkCore.Design10.0.1src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.EntityFrameworkCore.SqlServer10.0.1src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.Extensions.Logging.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.Extensions.Options$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetSystem.Security.Cryptography.Xml9.0.18src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj
NuGetMicrosoft.Extensions.Logging.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane/ExperimentFramework.DataPlane.csproj
NuGetMicrosoft.Extensions.Options$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane/ExperimentFramework.DataPlane.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.DataPlane/ExperimentFramework.DataPlane.csproj
NuGetMicrosoft.Extensions.Logging.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.Diagnostics/ExperimentFramework.Diagnostics.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.Diagnostics/ExperimentFramework.Diagnostics.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.Distributed.Redis/ExperimentFramework.Distributed.Redis.csproj
NuGetStackExchange.Redis2.10.1src/ExperimentFramework.Distributed.Redis/ExperimentFramework.Distributed.Redis.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.Distributed/ExperimentFramework.Distributed.csproj
NuGetMicrosoft.FeatureManagement$(MicrosoftFeatureManagementVersion)src/ExperimentFramework.FeatureManagement/ExperimentFramework.FeatureManagement.csproj
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions$(MicrosoftExtensionsVersion)src/ExperimentFramework.FeatureManagement/ExperimentFramework.FeatureManagement.csproj
All dependencies 141

Full resolved dependency set from the GitHub dependency graph: 28 direct and 113 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
NuGetAzure.Messaging.ServiceBus7.20.1direct
NuGetConfluent.Kafka2.12.0direct
NuGetMicrosoft.AspNetCore.Http.Abstractions2.3.9direct
NuGetMicrosoft.EntityFrameworkCore10.0.1direct
NuGetMicrosoft.EntityFrameworkCore8.0.11direct
NuGetMicrosoft.EntityFrameworkCore9.0.0direct
NuGetMicrosoft.EntityFrameworkCore.Design10.0.1direct
NuGetMicrosoft.EntityFrameworkCore.Design8.0.11direct
NuGetMicrosoft.EntityFrameworkCore.Design9.0.0direct
NuGetMicrosoft.EntityFrameworkCore.Design9.0.11direct
NuGetMicrosoft.EntityFrameworkCore.SqlServer10.0.1direct
NuGetMicrosoft.EntityFrameworkCore.SqlServer8.0.11direct
NuGetMicrosoft.EntityFrameworkCore.SqlServer9.0.0direct
NuGetMicrosoft.Extensions.Configuration10.0.1direct
NuGetMicrosoft.Extensions.Configuration.Binder10.0.1direct
NuGetMicrosoft.Extensions.Configuration.Binder8.0.2direct
NuGetMicrosoft.Extensions.DependencyInjection.Abstractions10.0.1direct
NuGetMicrosoft.Extensions.FileProviders.Physical10.0.1direct
NuGetMicrosoft.Extensions.Hosting.Abstractionsdirect
NuGetMicrosoft.Extensions.Hosting.Abstractions10.0.1direct
NuGetMicrosoft.Extensions.Logging.Abstractions10.0.1direct
NuGetMicrosoft.Extensions.Options10.0.1direct
NuGetMicrosoft.Extensions.Options8.0.2direct
NuGetMicrosoft.FeatureManagement4.4.0direct
NuGetStackExchange.Redis2.10.1direct
NuGetStackExchange.Redis2.8.16direct
NuGetSystem.Security.Cryptography.Xml9.0.18direct
NuGetYamlDotNet16.3.0direct
NuGetAzure.Core1.46.2indirect
NuGetAzure.Core.Amqp1.3.1indirect
NuGetBenchmarkDotNet0.15.8indirect
NuGetbunit2.7.2indirect
NuGetcoverlet.collector6.0.4indirect
NuGetFluentAssertions6.12.2indirect
NuGetFluentAssertions7.0.0indirect
NuGetHumanizer.Core2.14.1indirect
NuGetMarkdig0.44.0indirect
NuGetMathNet.Numerics5.0.0indirect
NuGetMicrosoft.AspNetCore.Http.Features2.3.0indirect
NuGetMicrosoft.AspNetCore.Identity.EntityFrameworkCore10.0.1indirect
NuGetMicrosoft.AspNetCore.Mvc.Testing10.0.1indirect
NuGetMicrosoft.AspNetCore.OpenApi10.0.1indirect
NuGetMicrosoft.Azure.Amqp2.7.0indirect
NuGetMicrosoft.Bcl.AsyncInterfaces8.0.0indirect
NuGetMicrosoft.Bcl.AsyncInterfaces9.0.0indirect
NuGetMicrosoft.Bcl.TimeProvider8.0.1indirect
NuGetMicrosoft.CodeAnalysis.Analyzers3.11.0indirect
NuGetMicrosoft.CodeAnalysis.Common4.14.0indirect
NuGetMicrosoft.CodeAnalysis.CSharp4.14.0indirect
NuGetMicrosoft.CodeAnalysis.CSharp.Analyzer.Testing.XUnit1.1.2indirect
NuGetMicrosoft.CodeAnalysis.CSharp.CodeFix.Testing.XUnit1.1.2indirect
NuGetMicrosoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit1.1.2indirect
NuGetMicrosoft.CodeAnalysis.CSharp.Workspaces4.14.0indirect
NuGetMicrosoft.CodeAnalysis.Workspaces.Common4.14.0indirect
NuGetMicrosoft.EntityFrameworkCore.InMemory10.0.1indirect
NuGetMicrosoft.EntityFrameworkCore.Relational10.0.1indirect
NuGetMicrosoft.EntityFrameworkCore.Relational8.0.11indirect
NuGetMicrosoft.EntityFrameworkCore.Relational9.0.0indirect
NuGetMicrosoft.EntityFrameworkCore.Sqlite10.0.1indirect
NuGetMicrosoft.EntityFrameworkCore.Sqlite9.0.11indirect
NuGetMicrosoft.Extensions.Caching.Abstractions8.0.0indirect
NuGetMicrosoft.Extensions.Caching.Memory10.0.1indirect
NuGetMicrosoft.Extensions.Caching.Memory8.0.1indirect
NuGetMicrosoft.Extensions.Configuration.Abstractions10.0.1indirect
NuGetMicrosoft.Extensions.Configuration.Json10.0.1indirect
NuGetMicrosoft.Extensions.Configuration.Json10.0.2indirect
NuGetMicrosoft.Extensions.DependencyInjection10.0.1indirect
NuGetMicrosoft.Extensions.Diagnostics.Abstractions10.0.1indirect
NuGetMicrosoft.Extensions.FileProviders.Abstractions10.0.1indirect
NuGetMicrosoft.Extensions.FileSystemGlobbing10.0.1indirect
NuGetMicrosoft.Extensions.Hosting10.0.1indirect
NuGetMicrosoft.Extensions.Hosting10.0.2indirect
NuGetMicrosoft.Extensions.Http.Resilience10.1.0indirect
NuGetMicrosoft.Extensions.Loggingindirect
NuGetMicrosoft.Extensions.Logging10.0.1indirect
NuGetMicrosoft.Extensions.Logging8.0.1indirect
NuGetMicrosoft.Extensions.Logging.Console10.0.1indirect
NuGetMicrosoft.Extensions.Primitives10.0.1indirect
NuGetMicrosoft.Extensions.Primitives8.0.0indirect
NuGetMicrosoft.Extensions.ServiceDiscovery10.1.0indirect
NuGetMicrosoft.FeatureManagement.AspNetCore4.0.0indirect
NuGetMicrosoft.FeatureManagement.AspNetCore4.4.0indirect
NuGetMicrosoft.NET.Test.Sdk17.12.0indirect
NuGetMicrosoft.NET.Test.Sdk17.14.0indirect
NuGetMicrosoft.NET.Test.Sdk17.14.1indirect
NuGetMicrosoft.NETCore.Platforms1.1.0indirect
NuGetMicrosoft.Playwright1.59.0indirect
NuGetMoq4.20.72indirect
NuGetNETStandard.Library2.0.3indirect
NuGetNSubstitute5.3.0indirect
NuGetNUnit4.3.2indirect
NuGetNUnit.Analyzers4.7.0indirect
NuGetNUnit3TestAdapter5.0.0indirect
NuGetOpenFeature2.11.1indirect
NuGetOpenTelemetry1.14.0indirect
NuGetOpenTelemetry.Exporter.Console1.14.0indirect
NuGetOpenTelemetry.Exporter.OpenTelemetryProtocol1.15.3indirect
NuGetOpenTelemetry.Extensions.Hosting1.14.0indirect
NuGetOpenTelemetry.Instrumentation.AspNetCore1.14.0indirect
NuGetOpenTelemetry.Instrumentation.Http1.14.0indirect
NuGetOpenTelemetry.Instrumentation.Runtime1.14.0indirect
NuGetPatternKit.Core0.147.1indirect
NuGetPipelines.Sockets.Unofficial2.2.8indirect
NuGetPolly8.6.5indirect
NuGetPolly.Core8.6.5indirect
NuGetReqnroll3.3.4indirect
NuGetReqnroll.xUnit3.3.4indirect
NuGetSwashbuckle.AspNetCore7.2.0indirect
NuGetSystem.Buffers4.5.1indirect
NuGetSystem.ClientModel1.4.2indirect
NuGetSystem.Collections.Immutable9.0.0indirect
NuGetSystem.CommandLine2.0.0-beta4.22272.1indirect
NuGetSystem.Composition9.0.0indirect
NuGetSystem.Composition.AttributedModel9.0.0indirect
NuGetSystem.Composition.Convention9.0.0indirect
NuGetSystem.Composition.Hosting9.0.0indirect
NuGetSystem.Composition.Runtime9.0.0indirect
NuGetSystem.Composition.TypedParts9.0.0indirect
NuGetSystem.Diagnostics.DiagnosticSource10.0.1indirect
NuGetSystem.IdentityModel.Tokens.Jwt8.15.0indirect
NuGetSystem.IO.Hashing9.0.10indirect
NuGetSystem.IO.Pipelines5.0.1indirect
NuGetSystem.IO.Pipelines9.0.0indirect
NuGetSystem.Memory4.5.5indirect
NuGetSystem.Memory.Data6.0.1indirect
NuGetSystem.Numerics.Vectors4.5.0indirect
NuGetSystem.Reflection.Metadata9.0.0indirect
NuGetSystem.Runtime.CompilerServices.Unsafe6.0.0indirect
NuGetSystem.Text.Encoding.CodePages7.0.0indirect
NuGetSystem.Text.Json10.0.1indirect
NuGetSystem.Threading.Channels7.0.0indirect
NuGetSystem.Threading.Tasks.Extensions4.5.4indirect
NuGetTestcontainers.Redis4.10.0indirect
NuGetTinyBDD.Xunit0.14.3indirect
NuGetTinyBDD.Xunit0.18.1indirect
NuGetxunit2.9.2indirect
NuGetxunit2.9.3indirect
NuGetxunit.runner.visualstudio2.8.2indirect
NuGetxunit.runner.visualstudio3.1.4indirect
NuGetxunit.runner.visualstudio3.1.5indirect
NuGetXunit.SkippableFact1.5.61indirect
Dependency advisories 0

This repository publishes no package the index resolves, so its own dependency graph was assessed — 139 packages, which also include development and test pins that never ship: 0 carry known advisories, of which 0 are direct. 2 could not be assessed — no resolved version, an unsupported ecosystem, or beyond the reported package list.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "ab-testing",
        "csharp",
        "dotnet",
        "experimentation",
        "feature-flags",
        "nuget",
        "observability"
      ],
      "is_fork": false,
      "size_kb": 5787,
      "has_wiki": true,
      "homepage": "https://jerrettdavis.github.io/ExperimentFramework/",
      "languages": {
        "C#": 4243961,
        "CSS": 45649,
        "HTML": 361359,
        "Shell": 1257,
        "Gherkin": 18781,
        "JavaScript": 16390,
        "PowerShell": 1352
      },
      "pushed_at": "2026-07-21T18:24:37Z",
      "created_at": "2025-12-21T17:48:37Z",
      "owner_type": "User",
      "updated_at": "2026-07-21T18:18:02Z",
      "description": ".NET framework for A/B testing, feature flags, trial fallback, and observability.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "C#",
      "significant_languages": [
        "C#"
      ]
    },
    "owner": {
      "blog": "jerrettdavis.com",
      "name": "JD Davis",
      "type": "User",
      "login": "JerrettDavis",
      "company": null,
      "location": "Tulsa, OK",
      "followers": 155,
      "avatar_url": "https://avatars.githubusercontent.com/u/2610199?v=4",
      "created_at": "2012-10-21T03:49:18Z",
      "is_verified": null,
      "public_repos": 125,
      "account_age_days": 5021
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.23.12",
          "kind": "patch",
          "published_at": "2026-07-21T18:24:55Z"
        },
        {
          "tag": "v0.23.11",
          "kind": "patch",
          "published_at": "2026-07-13T23:35:46Z"
        },
        {
          "tag": "v0.23.10",
          "kind": "patch",
          "published_at": "2026-07-07T17:33:22Z"
        },
        {
          "tag": "v0.23.9",
          "kind": "patch",
          "published_at": "2026-07-03T05:00:10Z"
        },
        {
          "tag": "v0.23.8",
          "kind": "patch",
          "published_at": "2026-07-03T04:05:45Z"
        },
        {
          "tag": "v0.23.7",
          "kind": "patch",
          "published_at": "2026-06-22T18:45:00Z"
        },
        {
          "tag": "v0.23.6",
          "kind": "patch",
          "published_at": "2026-06-22T14:46:11Z"
        },
        {
          "tag": "v0.23.5",
          "kind": "patch",
          "published_at": "2026-06-22T14:34:51Z"
        },
        {
          "tag": "v0.23.4",
          "kind": "patch",
          "published_at": "2026-06-16T01:44:12Z"
        },
        {
          "tag": "v0.23.3",
          "kind": "patch",
          "published_at": "2026-06-16T00:40:28Z"
        },
        {
          "tag": "v0.23.2",
          "kind": "patch",
          "published_at": "2026-06-09T17:07:32Z"
        },
        {
          "tag": "v0.23.1",
          "kind": "patch",
          "published_at": "2026-06-04T19:43:19Z"
        },
        {
          "tag": "v0.23.0",
          "kind": "minor",
          "published_at": "2026-06-02T02:34:08Z"
        },
        {
          "tag": "v0.22.17",
          "kind": "patch",
          "published_at": "2026-05-28T23:50:03Z"
        },
        {
          "tag": "v0.22.16",
          "kind": "patch",
          "published_at": "2026-04-24T16:03:17Z"
        },
        {
          "tag": "v0.22.15",
          "kind": "patch",
          "published_at": "2026-04-24T15:18:32Z"
        },
        {
          "tag": "v0.22.14",
          "kind": "patch",
          "published_at": "2026-04-24T14:12:19Z"
        },
        {
          "tag": "v0.22.13",
          "kind": "patch",
          "published_at": "2026-04-24T06:15:40Z"
        },
        {
          "tag": "v0.22.12",
          "kind": "patch",
          "published_at": "2026-04-24T03:51:26Z"
        },
        {
          "tag": "v0.22.11",
          "kind": "patch",
          "published_at": "2026-04-24T01:47:46Z"
        },
        {
          "tag": "v0.22.10",
          "kind": "patch",
          "published_at": "2026-04-23T23:48:58Z"
        },
        {
          "tag": "v0.22.9",
          "kind": "patch",
          "published_at": "2026-04-23T15:57:05Z"
        },
        {
          "tag": "v0.22.8",
          "kind": "patch",
          "published_at": "2026-04-22T23:56:08Z"
        },
        {
          "tag": "v0.22.7",
          "kind": "patch",
          "published_at": "2026-04-22T23:28:31Z"
        },
        {
          "tag": "v0.22.6",
          "kind": "patch",
          "published_at": "2026-04-22T21:08:29Z"
        },
        {
          "tag": "v0.22.5",
          "kind": "patch",
          "published_at": "2026-04-22T04:56:09Z"
        },
        {
          "tag": "v0.22.4",
          "kind": "patch",
          "published_at": "2026-04-20T13:26:14Z"
        },
        {
          "tag": "v0.22.3",
          "kind": "patch",
          "published_at": "2026-04-15T21:55:10Z"
        },
        {
          "tag": "v0.22.2",
          "kind": "patch",
          "published_at": "2026-03-25T01:18:43Z"
        },
        {
          "tag": "v0.22.1",
          "kind": "patch",
          "published_at": "2026-03-03T17:51:26Z"
        },
        {
          "tag": "v0.22.0",
          "kind": "minor",
          "published_at": "2026-01-16T05:50:44Z"
        },
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-01-15T20:43:11Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-01-15T20:28:30Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-01-15T19:55:41Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-01-15T06:46:28Z"
        },
        {
          "tag": "v0.17.5",
          "kind": "patch",
          "published_at": "2026-01-13T23:49:45Z"
        },
        {
          "tag": "v0.17.4",
          "kind": "patch",
          "published_at": "2026-01-13T15:32:38Z"
        },
        {
          "tag": "v0.17.4-13",
          "kind": "prerelease",
          "published_at": "2026-01-13T15:16:40Z"
        },
        {
          "tag": "v0.17.3",
          "kind": "patch",
          "published_at": "2026-01-13T04:04:40Z"
        },
        {
          "tag": "v0.17.1",
          "kind": "patch",
          "published_at": "2026-01-08T01:56:39Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-01-05T20:37:43Z"
        },
        {
          "tag": "v0.15.2",
          "kind": "patch",
          "published_at": "2026-01-03T23:24:58Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-01-03T22:49:05Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-01-02T17:54:20Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2025-12-30T17:53:17Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2025-12-30T17:52:30Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2025-12-30T06:28:29Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2025-12-30T05:54:03Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2025-12-28T21:35:59Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2025-12-28T02:10:17Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2025-12-28T01:23:43Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2025-12-27T06:00:10Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2025-12-26T07:19:39Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2025-12-26T06:46:31Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2025-12-25T21:44:10Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2025-12-24T06:39:31Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2025-12-24T05:37:40Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2025-12-23T04:21:42Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2025-12-22T06:19:05Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2025-12-22T06:15:33Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "d4289640c9f220f0847a471a9a8af92275f96125",
          "body": "….18 (#116)\n\nBumps System.Security.Cryptography.Xml from 9.0.15 to 9.0.18\n\n---\nupdated-dependencies:\n- dependency-name: System.Security.Cryptography.Xml\n  dependency-version: 9.0.18\n  dependency-type: direct:production\n  dependency-group: nuget\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump System.Security.Cryptography.Xml from 9.0.15 to 9.0…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-21T18:17:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b658811b29a00768aadfa21c587eefa23ad0a28e",
          "body": "…s (#113)\n\nBumps the github-actions-dependencies group with 2 updates: [marocchino/sticky-pull-request-comment](https://github.com/marocchino/sticky-pull-request-comment) and [github/codeql-action](https://github.com/github/codeql-action).\n\n\nUpdates `marocchino/sticky-pull-request-comment` from 3.0.\n[…]\nemver-minor\n  dependency-group: github-actions-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump the github-actions-dependencies group with 2 update…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-13T23:31:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "89c2a9266db01b30d3da37820309e54b7ef05357",
          "body": "Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>",
          "is_bot": true,
          "headline": "docs: regenerate screenshots () (#111)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-07T17:41:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53d8f91ddb415ce8349f9569b0eb87d9e6f7ebd2",
          "body": "…s (#112)\n\nBumps the github-actions-dependencies group with 2 updates: [marocchino/sticky-pull-request-comment](https://github.com/marocchino/sticky-pull-request-comment) and [github/codeql-action](https://github.com/github/codeql-action).\n\n\nUpdates `marocchino/sticky-pull-request-comment` from 3 to\n[…]\nemver-patch\n  dependency-group: github-actions-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump the github-actions-dependencies group with 2 update…",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-07T17:26:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bee4aa172b5e084677e0f1bd74d733adca24e810",
          "body": "… race (#110)\n\n* ci(coverage): fix hang by excluding Redis Testcontainers from coverage loop\n\nThe 'Collect coverage (per-project)' step iterated through all test\nprojects including ExperimentFramework.Governance.Persistence.Redis.Tests,\nwhich uses Testcontainers.Redis. Even though integration tests \n[…]\nt a live\nDashboardHost.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: GitHub Copilot <copilot@github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(e2e): stabilize category filter test against Blazor Server render…",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-07-03T04:54:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e515ad9acd517064d8b68b07fbdc5b0efbc875b2",
          "body": "Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>",
          "is_bot": true,
          "headline": "docs: regenerate screenshots () (#109)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-03T03:59:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bcac9035e7788456c99e280d445333ff6b4e20fd",
          "body": "…ce (#108)\n\nThe 'Select an experiment to view its governance state' and 'View\ntransition history' scenarios timed out in CI because the\nNotConfiguredMessage locator used .empty-state but the Blazor page\nrenders .info-message when IGovernancePersistenceBackplane is absent.\nThis caused IsConfiguredAsy\n[…]\ne and\n  ThenIShouldSeeTheTransitionHistorySection with the same IsConfiguredAsync()\n  check already used by ThenIShouldSeeAvailableTransitions.\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(e2e): guard governance lifecycle tests for unconfigured persisten…",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-06-22T18:39:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6a07a3d767463626c3972cf94936ec7e7ced1454",
          "body": "Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>",
          "is_bot": true,
          "headline": "docs: regenerate screenshots () (#106)",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-22T14:35:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c06da8b30d9955bf02dc840753233aeaa448a243",
          "body": "Bumps the github-actions-dependencies group with 1 update: [actions/checkout](https://github.com/actions/checkout).\n\n\nUpdates `actions/checkout` from 6.0.3 to 7.0.0\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.m\n[…]\nemver-major\n  dependency-group: github-actions-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/checkout (#107)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T14:28:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8eb8d974e01389bd50612645a548de398c71af55",
          "body": null,
          "is_bot": false,
          "headline": "chore: harden grouped dependency updates (#105)",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-06-16T01:17:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cccd12125385b24c29681dc25abc617ed221e0a4",
          "body": "Co-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>",
          "is_bot": true,
          "headline": "docs: regenerate screenshots",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-16T00:34:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d867ecf7345ff79c3381c2350b1d7353e68cb8e7",
          "body": "Bumps the all-dependencies group with 3 updates: [actions/checkout](https://github.com/actions/checkout), [codecov/codecov-action](https://github.com/codecov/codecov-action) and [github/codeql-action](https://github.com/github/codeql-action).\n\n\nUpdates `actions/checkout` from 6.0.2 to 6.0.3\n- [Relea\n[…]\non-update:semver-patch\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump the all-dependencies group with 3 updates (#103)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-09T17:00:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a26ddb1e99da17d58a615ff3e43e6d3a6d5d3232",
          "body": "Bumps the all-dependencies group with 1 update: [actions/checkout](https://github.com/actions/checkout).\n\n\nUpdates `actions/checkout` from 6 to 6.0.2\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](\n[…]\non-update:semver-patch\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/checkout in the all-dependencies group (#102)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-04T18:13:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8dd644f4b9dc68a41dde71db02082afa210f2955",
          "body": "* feat: dogfood PatternKit decorator pipeline\n\n* ci: refresh pr checks\n\n---------\n\nCo-authored-by: GitHub Copilot <copilot@github.com>",
          "is_bot": false,
          "headline": "feat: dogfood PatternKit in decorator pipeline (#101)",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-06-02T02:28:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "beb54bb205c85d665db58598b18586d17fb6b3c6",
          "body": "…e loop (#99)\n\n* ci(coverage): fix hang by excluding Redis Testcontainers from coverage loop\n\nThe 'Collect coverage (per-project)' step iterated through all test\nprojects including ExperimentFramework.Governance.Persistence.Redis.Tests,\nwhich uses Testcontainers.Redis. Even though integration tests \n[…]\nand fails with MSB1009.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: GitHub Copilot <copilot@github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci(coverage): fix hang by excluding Redis Testcontainers from coverag…",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-05-28T23:44:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "028421d21d6614b8ca25948e7d4bccade5dc61f0",
          "body": "…(#98)\n\nBumps the all-dependencies group with 1 update: [github/codeql-action](https://github.com/github/codeql-action).\n\n\nUpdates `github/codeql-action` from 4.35.5 to 4.36.0\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/bl\n[…]\non-update:semver-minor\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github/codeql-action in the all-dependencies group …",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-27T14:58:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04b87d668f77d566108bec298795eeb3fb15d2b1",
          "body": "…(#97)\n\nBumps the all-dependencies group with 1 update: [github/codeql-action](https://github.com/github/codeql-action).\n\n\nUpdates `github/codeql-action` from 4 to 4.35.5\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/ma\n[…]\non-update:semver-minor\n  dependency-group: all-dependencies\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github/codeql-action in the all-dependencies group …",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-23T05:10:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b505877421f4fd0372fb47535a83573b7d863cea",
          "body": "…ooldown (#96)\n\nCo-authored-by: GitHub Copilot <copilot@github.com>",
          "is_bot": false,
          "headline": "build(ci): configure dependabot grouping, conventional commits, and c…",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-05-22T22:27:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e570ccb8e85eb91db34e345e3e928b24c36394fa",
          "body": "…tions/dependency-review-action-5\n\nchore(deps): bump actions/dependency-review-action from 4 to 5",
          "is_bot": false,
          "headline": "Merge pull request #95 from JerrettDavis/dependabot/github_actions/ac…",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-05-11T17:37:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0305b1293d1e4109b9f7a127b8920831bfee26eb",
          "body": "Bumps [actions/dependency-review-action](https://github.com/actions/dependency-review-action) from 4 to 5.\n- [Release notes](https://github.com/actions/dependency-review-action/releases)\n- [Commits](https://github.com/actions/dependency-review-action/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dep\n[…]\name: actions/dependency-review-action\n  dependency-version: '5'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/dependency-review-action from 4 to 5",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-05-11T12:49:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9bb2da6ac1c0326f0a1f566d742072216f0b3b79",
          "body": "fix(ci): split coverage step to avoid Linux hang",
          "is_bot": false,
          "headline": "Merge pull request #94 from JerrettDavis/fix/ci-coverage-hang",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-29T15:38:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85b1650f5ca3ae7faf6db401da9e497a0c633097",
          "body": "The three Distributed.Redis test classes start real Docker containers via\nTestcontainers but had no [Trait(\"Category\",\"integration\")] marker, so\nthey ran in the standard CI filter and blocked the test host waiting for\nDocker — causing the hang that appeared after Dashboard.UI.Tests.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(tests): quarantine Testcontainers Redis tests with integration trait",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-29T00:42:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bbab3c6410470d296478d0eda297150fb51b8ff7",
          "body": "… hang\n\nWhen dotnet test runs the full solution with --collect:'XPlat Code Coverage',\nthe test host process for ExperimentFramework.Tests (2094 tests, many project\nrefs) crashes during AfterTestRunEnd coverage data collection. On Linux CI\nthis manifests as a 55-minute silent hang (socket doesn't RST\n[…]\n.cobertura.xml files are picked up by the existing reportgenerator\n   step unchanged.\n\nApplied the same split to the release job's test step.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): collect coverage per-project to fix solution-level test-host…",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-29T00:42:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8dd0970059cb0d47767841b58cdfebb10f4e49be",
          "body": "The dotnet test step was re-building multi-target source projects (e.g.\nExperimentFramework.Audit targets net8/9/10) immediately before launching\nthe net10.0 test host, which caused the Audit.Tests host to hang\nindefinitely during coverlet data-collector initialisation.\n\nAdding --no-build skips the \n[…]\nis.Tests so the NuGet cache key covers\nall test projects and the --use-lock-file restore does not regenerate\nlock files during the test step.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): add --no-build to test step to prevent rebuild race condition",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-29T00:42:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6c772ea45047e571c2310a024208dd7f7b408cf7",
          "body": "…tions/checkout-6\n\nchore(deps): bump actions/checkout from 4 to 6",
          "is_bot": false,
          "headline": "Merge pull request #93 from JerrettDavis/dependabot/github_actions/ac…",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-28T16:46:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f33203f3b0db2e3691509528978e630a14622213",
          "body": "…ter-evans/create-pull-request-8\n\nchore(deps): bump peter-evans/create-pull-request from 6 to 8",
          "is_bot": false,
          "headline": "Merge pull request #92 from JerrettDavis/dependabot/github_actions/pe…",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-28T16:46:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0172730f0abc49cd0a7161598e69811d9cc5a24",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 6.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v4...v6)\n\n---\nupdated-dependenc\n[…]\n:\n- dependency-name: actions/checkout\n  dependency-version: '6'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/checkout from 4 to 6",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-27T10:33:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4fdeb3a80c4e7a1785e7ba9312c818e6da549e06",
          "body": "Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6 to 8.\n- [Release notes](https://github.com/peter-evans/create-pull-request/releases)\n- [Commits](https://github.com/peter-evans/create-pull-request/compare/v6...v8)\n\n---\nupdated-dependencies:\n- depende\n[…]\nname: peter-evans/create-pull-request\n  dependency-version: '8'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump peter-evans/create-pull-request from 6 to 8",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-27T10:33:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "96195af2c58acdd825feec1b1623ba8c73c7711c",
          "body": "test: phase 4 — Razor instrumentation fix + coverage push to 85%+",
          "is_bot": false,
          "headline": "Merge pull request #90 from JerrettDavis/feat/coverage-phase-4",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-24T23:27:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d4611952621014cc72a72071b8a88e69fbc4f11",
          "body": "The new ExperimentFramework.Audit.Tests project was added in Phase 4\nwithout a lock file. The CI restore uses --use-lock-file, which caused\ndotnet test to hang for 53 minutes before the 60-minute job timeout\nkilled it. Generated locally with `dotnet restore --use-lock-file`.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): add missing packages.lock.json for Audit.Tests",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T23:14:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "073321fafea1d8833547523f4e87c6767a28383f",
          "body": "All 44 async render waits in Dashboard.UI.Tests reduced from 200ms to\n50ms. Tests still pass locally (47 tests in ~1s). This brings the\nfull bUnit suite within the 60-minute CI timeout on GitHub Actions.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(tests): reduce bUnit Task.Delay from 200ms to 50ms to cut CI time",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T22:09:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "96d9b02dbb6c847d991b0470fe0acd25c88dd1d7",
          "body": "Testcontainer-based Redis and SQL persistence tests are tagged\nCategory=integration. Starting Docker containers for each test\nclass adds ~50min to the test run, causing the job to hit the\n60-minute timeout. Exclude Category=integration from the regular\ntest step; these should run in a dedicated integration-tests job.\n\nAlso exclude Category=docs-screenshot (already excluded via E2E\nproject exclusion but making it explicit for clarity).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: exclude integration-category tests from main coverage run",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T21:00:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dd0b4c35c5ceac605221440ba13c184c97597b8e",
          "body": "The full solution test suite with coverage collection now includes\nAudit.Tests, DataPlane.Tests, Governance.Tests, Governance.Persistence.Tests\n(previously missing from slnx). The 30-minute timeout was too tight;\ntests were being cancelled mid-run.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: raise pr-checks timeout from 30m to 60m",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T19:55:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ea210a26d8611b005f230e19f18b8f5dfbe40d20",
          "body": "TryAddSingleton<IAuditSink> is a no-op when IAuditSink is already\nregistered via TryAddEnumerable (from AddExperimentAuditSink calls).\nReplace the incorrect assertion that GetRequiredService<IAuditSink>()\nreturns CompositeAuditSink — instead verify both sinks are enumerable\nvia GetServices<IAuditSink>(), which is the correct observable behavior.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(test): correct AddExperimentAuditComposite_WithMultipleSinks test",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T19:16:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2e4fd59e0b7382330f31b8ef5c2eae8e5e17a0c5",
          "body": "Track A: Fix CompilerGeneratedAttribute exclusion for Dashboard.UI async state machines.\n  - Add per-project coverage.runsettings that drops CompilerGeneratedAttribute from\n    ExcludeByAttribute (keeps GeneratedCodeAttribute for Razor render boilerplate).\n  - Wire RunSettingsFilePath in Dashboard.U\n[…]\n so their coverage is reported by Codecov.\n  - Register all previously-missing test projects in ExperimentFramework.slnx\n    so CI runs them.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: phase 4 — Razor instrumentation fix + coverage push toward 85%",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T18:28:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4be4f97b30608d2f518cc9bccf2b15aa4405b9d9",
          "body": "test: phase 3 coverage push (Dashboard.UI deep tests + Api error paths + CI fix)",
          "is_bot": false,
          "headline": "Merge pull request #89 from JerrettDavis/feat/coverage-phase-3",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-24T15:56:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0460f9bda5114b4591e82a3e9e1a27bbbf0a251f",
          "body": "…r tests\n\nTrack B — Dashboard.Api deep coverage:\n- DashboardApiErrorPathTests (63 new tests): covers every endpoint group with:\n  - Error paths: 503 on missing rollout backplane, 501 on missing plugin/targeting\n    service, 400 on invalid DSL/variant inputs, 404 on missing resources\n  - Response sha\n[…]\n,\n  IAnalyticsProvider, ITargetingManagementService, IPluginManagementService\n\nTotal new tests in Dashboard.Api.Tests: +63 (85 total, was 22)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(dashboard-api): add error-path, response-shape, and mock-provide…",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T15:40:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4a8febb7528870244d9695cc714e744dd0532fd1",
          "body": "…dModel unit tests\n\nTrack A — Dashboard.UI deep coverage:\n- ExperimentApiClientTests (60 tests): full HTTP method coverage via MockHandler;\n  covers all 20+ methods including error paths, null responses, HttpRequestException\n  handling, and all governance/plugin/DSL paths\n- ExperimentCodeGeneratorTe\n[…]\n policy); Reset() verification; default state assertions\n\nTotal new tests in Dashboard.UI.Tests: +131 (198 total, was 71 bUnit + 16 services)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(dashboard-ui): add ExperimentApiClient, CodeGenerator, and Wizar…",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T15:40:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "304fe60e2ba31e959d4e6a1c5100edf5bd675d07",
          "body": "…rage\n\npr-checks and e2e-tests jobs previously only fired on pull_request events.\nMerge commits therefore only got coverage from the release job (unit tests,\nno E2E), causing an ~8-point Codecov drop on every merge (74% PR → 66% main).\n\n- Broaden pr-checks trigger: pull_request | push to main\n- Broa\n[…]\nrue for both flags — no change needed\n\nPost-merge main CI will now upload both unittests + e2e flags, matching\nthe PR-branch coverage number.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: run tests on main pushes to keep Codecov in sync with branch cove…",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T15:39:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7848a459bb864297fd40e26fb98ae758f37c64f1",
          "body": "fix(ci): restore coverage accuracy after phase 1/2",
          "is_bot": false,
          "headline": "Merge pull request #88 from JerrettDavis/fix/coverage-reporting",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-24T15:12:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d2e7dfaccdadb8e2b3310d101f2948be45a5d150",
          "body": "- Add coverlet.collector to Governance.Persistence.Sql.Tests (was missing,\n  causing the 17 SQL persistence tests to not emit a coverage XML; the\n  Governance.Persistence.Sql assembly now reports 95% coverage to Codecov)\n- Remove samples/ExperimentFramework.DashboardHost/ from the e2e Codecov\n  flag\n[…]\nverlet was a plumbing gap that is now fixed; the remaining delta\n(Dashboard.UI, Dashboard.Api low coverage) is real and tracked in follow-up.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): scope coverage correctly and restore Codecov accuracy",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T15:01:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e44f9c57ee38ab081a7dfa8f778f56dbf846a867",
          "body": "test: coverage phase 2 — bUnit, Dashboard.Api contracts, expanded suites",
          "is_bot": false,
          "headline": "Merge pull request #87 from JerrettDavis/feat/coverage-phase-2",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-24T14:05:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "093f61eaf8adfe43614d729ff2ba23ece726f839",
          "body": "The Phase 2 agent's Dashboard.Api.Tests commit did not modify src/ but the\n4 failing tests in Dashboard.Tests/ApiEndpointTests.cs revealed that the\noptional-service endpoints (Plugins, Targeting, Analytics, RolloutStages)\nhad never had their test factory wired with stub implementations — causing\n501\n[…]\n route registered by RolloutEndpoints).\n\nNo src/ files changed. Dashboard.Api.Tests (22 tests) and Dashboard.Tests\n(16 tests) are both green.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "revert: restore original Dashboard.Api endpoint semantics",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T13:48:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67deba96e9b5bb74f78f5f38a195c67a53c96c23",
          "body": "New project ExperimentFramework.Dashboard.UI.Tests covers:\n- DashboardStateService: kill switches, expanded items, filter state,\n  variant cache, kill-switch sync, plugin implementation cache (31 tests)\n- ThemeService: null guard, theme update, event raising, CSS variable\n  generation (9 tests)\n- Ho\n[…]\n2.7.2 BunitContext API with SetRendererInfo to simulate SSR\nnon-interactive pass for components that guard behind RendererInfo.IsInteractive.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(dashboard-ui): add bUnit component and service tests (71 tests)",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T13:24:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aca8c9dfb1d08b47cb24f76a540e0e8ac13fc5ba",
          "body": "New project ExperimentFramework.Dashboard.Api.Tests exercises all endpoint\ngroups via a minimal in-process WebApplication host (no full middleware stack).\nCovers experiments CRUD, toggle, activate-variant, analytics usage stats,\ngovernance state/approvals/versions/transitions, configuration info/yam\n[…]\nlpers support read-only vs mutable\ntoggle scenarios. Assertions reflect actual endpoint semantics (501 when\noptional service not registered).\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(dashboard-api): add Dashboard.Api contract tests (22 tests)",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T13:12:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "86aeb33afd659807b193f9b774a445b9d3369b2c",
          "body": "…test project (12 tests)\n\nNew test project ExperimentFramework.Governance.Persistence.Redis.Tests\nusing Testcontainers.Redis 4.10.0. Covers: state serialization round-trip,\nkey-prefix isolation, optimistic concurrency (save/update/conflict),\nconcurrent writers to transition list, approval record ret\n[…]\nition ID, non-existent returns null/empty, tenant isolation.\nRegistered in ExperimentFramework.slnx along with SQL tests and Dashboard.Tests.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(governance-persistence-redis): add Governance.Persistence.Redis …",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T13:00:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "85a92cc1a0c32389243d1c7cd20c2d777a574368",
          "body": "…17 tests\n\nAdd SqlPersistenceExtendedTests: 10 new integration scenarios covering\nCRUD operations, ETag-based optimistic concurrency, transition history\nordering, approval record retrieval by transition ID, policy evaluation\nappend/retrieve/latest, and environment scoping.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(governance-persistence-sql): expand SQL persistence coverage to …",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T12:59:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2d73128782bac5b69425932580457d0734e79a40",
          "body": "Add AdminRbacTests: 12 new scenarios covering registry mutations,\nread-only vs mutable registry boundary, state transitions, case\nsensitivity, custom prefixes, and double-toggle idempotency.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(admin): expand Admin coverage to 15 tests",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T12:59:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a3988ff18d321dc013431ca34334ded727f5639",
          "body": "test: phase 1 coverage improvements (StickyRouting + Metrics.Exporters + E2E host coverage)",
          "is_bot": false,
          "headline": "Merge pull request #86 from JerrettDavis/feat/coverage-phase-1",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-24T06:10:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe33821385a14e4e5f494d5d13b53f832b71d0c8",
          "body": "Previous fix's 15s visibility wait was not enough under CI load — the\nSignalR circuit handshake can race SelectOptionAsync, so the server\nnever processes the change event and the downstream UI never renders.\n\nApply a three-part hardening to the helpers that select the first\nexperiment in the dashboa\n[…]\nscenarios\n  (Start a rollout, Add rollout stages, Versions page shows version\n  history) and the newly-flaky Search audit entries.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(e2e): wait for Blazor Server circuit before firing @onchange",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T05:55:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b0ed211aca9c532d2f12154dbc66784597f10495",
          "body": "Same InteractiveServer reconnect-race pattern as the previous GovernanceAudit\nfix (0b5412c) — scenarios were interacting with conditionally-rendered\nelements before the Blazor circuit had finished hydrating.\n\nRolloutStepDefinitions.SelectFirstExperimentAsync:\n  Previous implementation counted option\n[…]\nost (--seed=docs):\n  Rollout + GovernanceVersions feature files — 8/8 passing, including the\n  three previously-failing scenarios.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(e2e): resolve rollout / versions Blazor hydration races",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T05:37:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "75ad47a43e5cedb02abd2b0660aefe3532614993",
          "body": "Changes to .github/workflows/ci.yml e2e-tests job:\n- Install dotnet-coverage tool before launching the host\n- Wrap DashboardHost launch with dotnet-coverage collect -f cobertura so\n  that server-side code is instrumented during the Playwright run\n- Send SIGTERM to the wrapper after the test run to f\n[…]\ncally\n- Documents how to reproduce the coverage collection locally using\n  dotnet-coverage collect in one terminal and dotnet test in another\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: collect E2E host coverage via dotnet-coverage, add e2e Codecov flag",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T05:10:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6c08bbecf387f76e5d9d07e4156fa4010d322a08",
          "body": "…tests)\n\nNew test project tests/ExperimentFramework.Metrics.Exporters.Tests targeting\nnet8.0;net9.0;net10.0 with coverlet.collector instrumentation.\n\nCovers PrometheusExperimentMetrics:\n- Counter accumulation, TYPE declaration line, label rendering,\n  independent tracking per tag-set\n- Gauge last-va\n[…]\nCounter / RecordHistogram / SetGauge / RecordSummary smoke tests\n- Dispose idempotency; multiple instances with different meter names coexist\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(metrics-exporters): add Metrics.Exporters unit test project (30 …",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T05:09:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "06280d0a8f85ce67f481c5b464d691805b2e08ed",
          "body": "New test project tests/ExperimentFramework.StickyRouting.Tests targeting\nnet8.0;net9.0;net10.0 with coverlet.collector instrumentation.\n\nCovers:\n- StickyTrialRouter: determinism, single-key short-circuit, empty list\n  exception, key-order independence, distribution uniformity (2-way and\n  3-way), un\n[…]\nexception swallowing\n- DI registration: AddExperimentStickyRouting registers\n  ISelectionModeProviderFactory with the correct mode identifier\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(sticky-routing): add StickyRouting unit test project (23 tests)",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T05:09:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fa57f3bd2205c9f024fd036ee176aaa157cdc0cf",
          "body": "test(aspire-demo): migrate E2E tests to Reqnroll + add sample runmode docs",
          "is_bot": false,
          "headline": "Merge pull request #85 from JerrettDavis/test/aspire-demo-reqnroll",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-24T03:46:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b5412ce2b5dff28eff5cef61704ec619a219075",
          "body": "…downs)\n\nApply the same Blazor InteractiveServer reconnect-wait pattern to the\nAudit page: wait for option[1] to attach before selecting an experiment,\nand wait for the type-filter / search-input to be visible before\ninteracting — both elements are only rendered once an experiment is\nselected and non-empty.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(e2e): resolve GovernanceAudit timing failures (filter/search drop…",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T03:32:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f61de8168439ac562247c60bfa100803b214251c",
          "body": "Audit log / governance versions / state transition tests were failing due\nto a shared race with Blazor InteractiveServer's reconnect cycle.\n\nAfter Playwright navigates and the Blazor SignalR circuit connects, each\nInteractiveServer component re-runs OnInitializedAsync. During this phase\nthe experime\n[…]\nm to be attached before\n  interacting, so a select during the reconnect loading phase no longer\n  silently picks the empty placeholder value.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(e2e): resolve 3 deterministic E2E failures in main suite",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T03:13:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b6fd52d192acb6ecbbd9b25fffc02a8ee3ab61d4",
          "body": "… docs\n\n- Convert AspireDemo.E2ETests from NUnit to Reqnroll + xUnit + Playwright\n  to match the main E2E project pattern (Features/, StepDefinitions/,\n  Hooks/, Drivers/, Support/)\n- Add 18 scenarios across Authentication, Blog, LiveDemo features with\n  role-based auto-login hooks and screenshot-on\n[…]\n, samples/README, and docs TOC\n- Fix login-error selector in AuthenticationStepDefinitions (.alert-error)\n  — suite now 18/18 passing locally\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(aspire-demo): migrate E2E tests to Reqnroll + add sample runmode…",
          "author_name": "GitHub Copilot",
          "author_login": null,
          "committed_at": "2026-04-24T02:33:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e5c196419fdb646d21ac002717d9f61516d5aa1d",
          "body": "Bumps OpenTelemetry.Exporter.OpenTelemetryProtocol from 1.15.2 to 1.15.3\n\n---\nupdated-dependencies:\n- dependency-name: OpenTelemetry.Exporter.OpenTelemetryProtocol\n  dependency-version: 1.15.3\n  dependency-type: direct:production\n  dependency-group: nuget\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Bump the nuget group with 1 update (#84)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-24T01:42:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d54baedd9b8358d91a98354a3f851b4e59178899",
          "body": "* Bump the nuget group with 1 update\n\nBumps OpenTelemetry.Exporter.OpenTelemetryProtocol from 1.14.0 to 1.15.2\n\n---\nupdated-dependencies:\n- dependency-name: OpenTelemetry.Exporter.OpenTelemetryProtocol\n  dependency-version: 1.15.2\n  dependency-type: direct:production\n  dependency-group: nuget\n...\n\nS\n[…]\npendabot[bot]@users.noreply.github.com>\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Bump the nuget group with 1 update (#83)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-23T23:43:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "82142fe4a2b984dbc935ec42a859494dcee4e2e5",
          "body": "…PR doc build check (#81)",
          "is_bot": false,
          "headline": "fix(docs): exclude samples/benchmarks/tools from docfx metadata; add …",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-04-23T16:50:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e302fa99f9d67c3a73d7db67cebb6bf67bb5c969",
          "body": "Bumps System.Security.Cryptography.Xml from 9.0.0 to 9.0.15\n\n---\nupdated-dependencies:\n- dependency-name: System.Security.Cryptography.Xml\n  dependency-version: 9.0.15\n  dependency-type: direct:production\n  dependency-group: nuget\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "Bump the nuget group with 1 update (#82)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-23T16:40:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d3be5fe83fb3ea7d3a8c7d388003df4b91df40ab",
          "body": "* [ExperimentFramework] Refine docs site design\n\n- Rewrite main.css for flat, developer-grade aesthetic (neutral grays + blue accent, radii ≤6px, no gradients, GitHub-style syntax highlighting)\n- Widen docs article to 88rem with 78ch prose measure\n- Center landing page layout\n- CI build error (CS023\n[…]\nhrink before returning.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: GitHub Copilot <copilot@github.com>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "[ExperimentFramework] Refine docs site design (#80)",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-23T15:51:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ae2d6e70a5bf276fdebd0742ac393a357292c1e5",
          "body": "…enerated namespaces (#78)",
          "is_bot": false,
          "headline": "fix: add dotnet build -c Release step before docfx to resolve Razor-g…",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-04-22T23:50:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b5f6df09b4f75d253d4f169c786176d4447cedd",
          "body": "Describes the multi-package architecture, startup-time experiment\nregistration model, dashboard data-plane quirks, e2e screenshot\npipeline, and build/test/docs commands.\n\nCo-authored-by: GitHub Copilot <copilot@github.com>\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add CLAUDE.md with project-specific guidance for Claude Code (#79)",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-22T23:23:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "903b1072776fe24c1590ce9efaeb9c4c80c3f0a7",
          "body": "…shot CI (#77)\n\n* docs(spec): user guide and dashboard screenshots design\n\nCaptures the approved design for a new User Guide section\n(Developer Setup + Operator Guide tutorials + Reference),\nPlaywright-driven screenshot capture with a curated demo\nseeder, and weekly CI regeneration. Execution plan f\n[…]\no-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: GitHub Copilot <copilot@github.com>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: user guide foundation + first tutorial, dev-setup embed, screen…",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-22T21:03:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9efdf6e4f36ccdc28e89bcd81c26e7437112a280",
          "body": "…ion (#76)\n\nMove IncludeSymbols/SymbolPackageFormat to Directory.Build.props with\nPackageType != Analyzer condition. Analyzer packages don't have lib/\noutput, so snupkg generation fails. Remove global /p:IncludeSymbols\noverride from CI pack step.\n\nCo-authored-by: GitHub Copilot <copilot@github.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(pack): resolve NU5017 for analyzer packages during symbol generat…",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-22T04:50:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8aa0e4b902bbe6e007376a873a4c13f9ad283edc",
          "body": "* fix(ci): exclude E2E tests from main test runs\n\nE2E tests require Playwright browsers and a running app server.\nThey now only run in the dedicated e2e-tests CI job.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n* fix(pack): resolve NU5039 NuGet pack error for Plugins packa\n[…]\no-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: GitHub Copilot <copilot@github.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(pack): resolve NU5039 NuGet pack error for Plugins package (#75)",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-22T04:37:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c0f34dfdba9d05873357d8472ba85b2b0755948",
          "body": "E2E tests require Playwright browsers and a running app server.\nThey now only run in the dedicated e2e-tests CI job.\n\nCo-authored-by: GitHub Copilot <copilot@github.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): exclude E2E tests from main test runs (#74)",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-22T04:27:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3e4518fdd4195b6cf323ce850dfe135d18d5ae39",
          "body": "* fix(tests): increase timeout margin in Timeout_FallbackToDefault_UsesDefaultWhenExceeded\n\nThe 100ms timeout was too tight for CI runners under load (1852 tests\nrunning concurrently with Docker containers). SuccessService's\nTask.Delay(10) occasionally exceeded the 100ms budget, causing the\nfallback\n[…]\n---------\n\nCo-authored-by: GitHub Copilot <copilot@github.com>\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Harden framework: badges, coverage, CI, Dashboard API, E2E tests (#73)",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-22T04:10:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f0a962ec660e7db8503ef8a217e7e65d5c4576cd",
          "body": "…DefaultWhenExceeded\n\nThe 100ms timeout was too tight for CI runners under load (1852 tests\nrunning concurrently with Docker containers). SuccessService's\nTask.Delay(10) occasionally exceeded the 100ms budget, causing the\nfallback trial to also time out and the test to fail spuriously.\n\nIncreasing t\n[…]\ns) while\ngiving the SuccessService fallback ample margin on loaded CI workers.\n\nCo-authored-by: GitHub Copilot <copilot@github.com>\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(tests): increase timeout margin in Timeout_FallbackToDefault_Uses…",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-04-20T13:21:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "97ab64c878cf3ad6fd595efe24ca79b4a029b554",
          "body": "Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 4 to 5.\n- [Release notes](https://github.com/actions/upload-pages-artifact/releases)\n- [Commits](https://github.com/actions/upload-pages-artifact/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): Bump actions/upload-pages-artifact from 4 to 5 (#71)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-20T12:35:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "01c2caae7227b99082b567f67e8d4b4b2f58b453",
          "body": "…nFileWatcher (#70)\n\nThe Hot_reload_ignores_invalid_configuration test was failing because\nFileSystemWatcher fires a Changed event when a file is opened/truncated\n(before new content is written). The old rate-limiter would immediately\ntrigger TriggerReload on the first event — at that moment the fil\n[…]\ns/e1b4bff1-134f-4aa9-9af8-cfb3f7cbc850\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix: Replace rate-limiter debounce with true debounce in Configuratio…",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-04-15T21:49:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "48a9189b24ae93bdcfa7087ba221f9c973a16ab3",
          "body": "Bumps [softprops/action-gh-release](https://github.com/softprops/action-gh-release) from 2 to 3.\n- [Release notes](https://github.com/softprops/action-gh-release/releases)\n- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)\n- [Commits](https://github.com/softprops/\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): Bump softprops/action-gh-release from 2 to 3 (#69)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-04-13T14:28:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8734dc0acd5d89398444c40095dd84339990f8c9",
          "body": "Bumps [actions/deploy-pages](https://github.com/actions/deploy-pages) from 4 to 5.\n- [Release notes](https://github.com/actions/deploy-pages/releases)\n- [Commits](https://github.com/actions/deploy-pages/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: actions/deploy-pages\n  dependency-\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): Bump actions/deploy-pages from 4 to 5 (#67)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-31T21:46:52Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c4e6837308343dfd65b4eb1fe7e5eee8ca01cd0f",
          "body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 5 to 6.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): Bump codecov/codecov-action from 5 to 6 (#68)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-31T21:44:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1b67754072af10780116285c541bec5c7bbd1825",
          "body": "…(#66)\n\nBumps [marocchino/sticky-pull-request-comment](https://github.com/marocchino/sticky-pull-request-comment) from 2 to 3.\n- [Release notes](https://github.com/marocchino/sticky-pull-request-comment/releases)\n- [Commits](https://github.com/marocchino/sticky-pull-request-comment/compare/v2...v3)\n\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): Bump marocchino/sticky-pull-request-comment from 2 to 3 …",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-16T18:39:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a2e181577798901260e8dc433b954e1a1a3543d8",
          "body": "Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 6 to 7.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifac\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): Bump actions/upload-artifact from 6 to 7 (#65)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-03-03T17:46:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c35335b9d2aa726aee36bcd6a1f86e9148d8455b",
          "body": "Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 6.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v4...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifac\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): Bump actions/upload-artifact from 4 to 6 (#64)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-19T17:38:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "869597f0ab30c75d2b0a6796287b07d1dcecd4be",
          "body": "…lidation (#63)",
          "is_bot": false,
          "headline": "feat(analyzers): Add Roslyn analyzers for experiment configuration va…",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-01-16T05:45:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94c110f12bed332aa117b4697f12ddcf8c346fb6",
          "body": "…lation and integration testing models (#57)",
          "is_bot": false,
          "headline": "feat(simulation): Add ExperimentFramework.Simulation package with iso…",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-01-15T20:38:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20947cdc1969cacdd1b295fc733abb0e189ef6b8",
          "body": "…n validation and diagnostics (#61)",
          "is_bot": false,
          "headline": "feat(cli): Add `dotnet experimentframework` CLI tool for configuratio…",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-01-15T20:24:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e4a9a034834c213c28ae3c2d5d4367523e50e030",
          "body": "…vent sinks for standardized observability (#59)",
          "is_bot": false,
          "headline": "feat(diagnostics): Add ExperimentFramework.Diagnostics package with e…",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-01-15T19:51:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15a9c6f8ebd659ceba78d3646163dc635261adbd",
          "body": "…tic testing (#55)",
          "is_bot": false,
          "headline": "feat(testing): Add ExperimentFramework.Testing package for determinis…",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-01-15T06:41:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39d101a94e901f5ca1a77eb48b2f44a427e7d3de",
          "body": "* Initial plan\n\n* Fix package downgrade errors in ExperimentFramework.Benchmarks\n\nCo-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>\n\n* Fix StackExchange.Redis API compatibility issue\n\nCo-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(ci): Fix CI build errors after package bump (#53)",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-01-13T23:44:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2f6c32630ade2f157d31f5bb7806d96d3c833c3c",
          "body": "* chore: Bump the minor-and-patch group with 31 updates\n\nBumps BenchmarkDotNet from 0.14.0 to 0.15.8\nBumps Markdig from 0.38.0 to 0.44.0\nBumps Microsoft.AspNetCore.Http.Abstractions from 2.2.0 to 2.3.9\nBumps Microsoft.AspNetCore.OpenApi from 10.0.0 to 10.0.1\nBumps Microsoft.CodeAnalysis.Analyzers fr\n[…]\n\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>\nCo-authored-by: JD Davis <mxjerrett@gmail.com>\nCo-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: Bump the minor-and-patch group with 31 updates (#46)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-13T20:21:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "374de57d44c5897ca3a89e01440461b552f51eda",
          "body": null,
          "is_bot": false,
          "headline": "ci: Change PACKAGE_VERSION to use majorMinorPatch (#50)",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-01-13T15:28:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7f0b01019942b52f6d9e38f319629ccd5efbd0d",
          "body": null,
          "is_bot": false,
          "headline": "ci: Update PACKAGE_VERSION to use semVer output (#49)",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-01-13T15:12:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1200be4435ad226f1cc1234d614f307f671d40b7",
          "body": null,
          "is_bot": false,
          "headline": "ci: Update GitVersion configuration for workflow and mode (#48)",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-01-13T14:57:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a94013a96b31680e5219edb2607a7fedbc3d6503",
          "body": null,
          "is_bot": false,
          "headline": "ci: Change versioning mode from Mainline to GitHubFlow (#47)",
          "author_name": "JD Davis",
          "author_login": "JerrettDavis",
          "committed_at": "2026-01-13T14:41:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad9095bbc675148e951ffbfe91c57b93c3e457ba",
          "body": null,
          "is_bot": false,
          "headline": "fix(ci): clean GitVersion cache and add version logging (#45)",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-01-13T05:23:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9c8e98a977f866bd2094085f5181e5de411ba12",
          "body": "* Initial plan\n\n* Fix GitVersion mode configuration from MainLine to Mainline\n\nCo-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(ci): fix GitVersion mode configuration: MainLine → Mainline (#44)",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-01-13T04:27:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3c9158383a6bda22242536c23a3bf55a914845f2",
          "body": "…ions@v4 (#43)\n\n* Initial plan\n\n* fix(ci): Update GitVersion from 5.x to 6.x to fix install error\n\nCo-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>\n\n---------\n\nCo-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>\nCo-authored-by: JerrettDavis <2610199+JerrettDavis@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(ci): Update GitVersion to 6.x for compatibility with gittools/act…",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-01-13T04:19:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1ea2d2b8969b4af59be0a21f8a5c1136f7d5b412",
          "body": "Bumps [gittools/actions](https://github.com/gittools/actions) from 1 to 4.\n- [Release notes](https://github.com/gittools/actions/releases)\n- [Commits](https://github.com/gittools/actions/compare/v1...v4)\n\n---\nupdated-dependencies:\n- dependency-name: gittools/actions\n  dependency-version: '4'\n  depen\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump gittools/actions from 1 to 4 (#41)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-13T04:05:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "5e20c402e8ba95e2fb9f9b071e885a958df2b379",
          "body": "Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5.\n- [Release notes](https://github.com/codecov/codecov-action/releases)\n- [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/codecov/codecov-action/compare/v\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump codecov/codecov-action from 4 to 5 (#40)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-13T04:02:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dd8625e5416d6c173f54c2f5a087b86d682394b2",
          "body": "Bumps [github/codeql-action](https://github.com/github/codeql-action) from 3 to 4.\n- [Release notes](https://github.com/github/codeql-action/releases)\n- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/github/codeql-action/compare/v3...v4)\n\n-\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump github/codeql-action from 3 to 4 (#39)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-13T04:02:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c59e5b44723a4ed07b40895379a0f014241691f5",
          "body": "Bumps [actions/setup-dotnet](https://github.com/actions/setup-dotnet) from 3 to 5.\n- [Release notes](https://github.com/actions/setup-dotnet/releases)\n- [Commits](https://github.com/actions/setup-dotnet/compare/v3...v5)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-dotnet\n  dependency-\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/setup-dotnet from 3 to 5 (#38)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-13T04:01:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cab737af7535de6c2331988fdc7d38163a7481c2",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 6.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v3...v6)\n\n---\nupdated-dependenc\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/checkout from 3 to 6 (#37)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-13T04:01:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c696d47a4585e4ae4cb84ddab23a2c9408266696",
          "body": "Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 3 to 4.\n- [Release notes](https://github.com/actions/upload-pages-artifact/releases)\n- [Commits](https://github.com/actions/upload-pages-artifact/compare/v3...v4)\n\n---\nupdated-dependencies:\n- dependency-name\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/upload-pages-artifact from 3 to 4 (#36)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-13T04:00:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "19f7f141a4a8093597b66026869fad3c79da763a",
          "body": "Bumps [actions/labeler](https://github.com/actions/labeler) from 5 to 6.\n- [Release notes](https://github.com/actions/labeler/releases)\n- [Commits](https://github.com/actions/labeler/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: actions/labeler\n  dependency-version: '6'\n  dependency\n[…]\nirect:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore(deps): bump actions/labeler from 5 to 6 (#35)",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-01-13T04:00:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 60,
      "commits_last_year": 135,
      "latest_release_at": "2026-07-21T18:24:55Z",
      "latest_release_tag": "v0.23.12",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 20,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 57,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "ExperimentFramework.Dashboard",
          "exists": true,
          "license": null,
          "keywords": [
            "experiments",
            "ab-testing",
            "dashboard",
            "blazor",
            "governance",
            "analytics",
            "multi-tenancy",
            "aspnetcore",
            "middleware",
            "hangfire-style"
          ],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/ExperimentFramework.Dashboard",
          "is_deprecated": false,
          "latest_version": "0.23.12",
          "repository_url": "https://github.com/JerrettDavis/ExperimentFramework",
          "versions_count": 14,
          "total_downloads": 1380,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T18:25:02.657000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "ExperimentFramework.DataPlane",
          "exists": true,
          "license": null,
          "keywords": [
            "experiments",
            "ab-testing",
            "data-plane",
            "telemetry",
            "observability",
            "beta"
          ],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/ExperimentFramework.DataPlane",
          "is_deprecated": false,
          "latest_version": "0.23.12",
          "repository_url": "https://github.com/jerrettdavis/ExperimentFramework",
          "versions_count": 14,
          "total_downloads": 1334,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T18:25:05.327000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "ExperimentFramework.Diagnostics",
          "exists": true,
          "license": null,
          "keywords": [
            "experiments",
            "diagnostics",
            "telemetry",
            "logging",
            "opentelemetry",
            "observability"
          ],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/ExperimentFramework.Diagnostics",
          "is_deprecated": false,
          "latest_version": "0.23.12",
          "repository_url": "https://github.com/JerrettDavis/ExperimentFramework",
          "versions_count": 14,
          "total_downloads": 1333,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T18:25:06.287000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "ExperimentFramework.Dashboard.UI",
          "exists": true,
          "license": null,
          "keywords": [
            "experiments",
            "ab-testing",
            "dashboard",
            "blazor",
            "ui",
            "aspnetcore",
            "razor"
          ],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/ExperimentFramework.Dashboard.UI",
          "is_deprecated": false,
          "latest_version": "0.23.12",
          "repository_url": "https://github.com/JerrettDavis/ExperimentFramework",
          "versions_count": 14,
          "total_downloads": 1527,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T18:25:04.360000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "ExperimentFramework.Configuration",
          "exists": true,
          "license": null,
          "keywords": [
            "experiments",
            "ab-testing",
            "feature-flags",
            "configuration",
            "yaml",
            "json"
          ],
          "ecosystem": "nuget",
          "matches_repo": null,
          "registry_url": "https://www.nuget.org/packages/ExperimentFramework.Configuration",
          "is_deprecated": false,
          "latest_version": "0.23.12",
          "repository_url": null,
          "versions_count": 51,
          "total_downloads": 14046,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T18:25:02.210000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "ExperimentFramework.Dashboard.Api",
          "exists": true,
          "license": null,
          "keywords": [
            "experiments",
            "ab-testing",
            "dashboard",
            "api",
            "rest",
            "aspnetcore"
          ],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/ExperimentFramework.Dashboard.Api",
          "is_deprecated": false,
          "latest_version": "0.23.12",
          "repository_url": "https://github.com/JerrettDavis/ExperimentFramework",
          "versions_count": 14,
          "total_downloads": 1505,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T18:25:03.913000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "ExperimentFramework.Dashboard.Abstractions",
          "exists": true,
          "license": null,
          "keywords": [
            "experiments",
            "ab-testing",
            "dashboard",
            "multi-tenancy",
            "abstractions",
            "extensibility",
            "aspnetcore"
          ],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/ExperimentFramework.Dashboard.Abstractions",
          "is_deprecated": false,
          "latest_version": "0.23.12",
          "repository_url": "https://github.com/JerrettDavis/ExperimentFramework",
          "versions_count": 14,
          "total_downloads": 1936,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T18:25:03.083000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        },
        {
          "name": "ExperimentFramework.DataPlane.Abstractions",
          "exists": true,
          "license": null,
          "keywords": [
            "experiments",
            "ab-testing",
            "data-plane",
            "telemetry",
            "observability",
            "beta"
          ],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/ExperimentFramework.DataPlane.Abstractions",
          "is_deprecated": false,
          "latest_version": "0.23.12",
          "repository_url": "https://github.com/jerrettdavis/ExperimentFramework",
          "versions_count": 14,
          "total_downloads": 1756,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T18:25:05.777000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 1,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-01-07",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": {
        "days": [
          {
            "date": "2026-01-12",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_stars": 1
      },
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "demos",
        "samples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "benchmarks/ExperimentFramework.Benchmarks/ExperimentFramework.Benchmarks.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.ApiService/AspireDemo.ApiService.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.AppHost/AspireDemo.AppHost.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Contracts/AspireDemo.Blog.Contracts.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Auth/AspireDemo.Blog.Plugins.Auth.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Data/AspireDemo.Blog.Plugins.Data.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Editor/AspireDemo.Blog.Plugins.Editor.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Syndication/AspireDemo.Blog.Plugins.Syndication.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog/AspireDemo.Blog.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.E2ETests/AspireDemo.E2ETests.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.ServiceDefaults/AspireDemo.ServiceDefaults.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.Web.Tests/AspireDemo.Web.Tests.csproj",
        "samples/ExperimentFramework.AspireDemo/AspireDemo.Web/AspireDemo.Web.csproj",
        "samples/ExperimentFramework.BanditOptimizer/ExperimentFramework.BanditOptimizer.csproj",
        "samples/ExperimentFramework.ComprehensiveSample/ExperimentFramework.ComprehensiveSample.csproj",
        "samples/ExperimentFramework.DashboardHost/ExperimentFramework.DashboardHost.csproj",
        "samples/ExperimentFramework.DataPlaneSample/ExperimentFramework.DataPlaneSample.csproj",
        "samples/ExperimentFramework.FeatureFlagDemo/ExperimentFramework.FeatureFlagDemo.csproj",
        "samples/ExperimentFramework.GovernanceSample/ExperimentFramework.GovernanceSample.csproj",
        "samples/ExperimentFramework.OpenTelemetryDataPlaneSample/ExperimentFramework.OpenTelemetryDataPlaneSample.csproj",
        "samples/ExperimentFramework.PluginHostSample/ExperimentFramework.PluginHostSample.csproj",
        "samples/ExperimentFramework.ResilienceDemo/ExperimentFramework.ResilienceDemo.csproj",
        "samples/ExperimentFramework.SampleConsole/ExperimentFramework.SampleConsole.csproj",
        "samples/ExperimentFramework.SamplePlugin/ExperimentFramework.SamplePlugin.csproj",
        "samples/ExperimentFramework.SampleWebApp/ExperimentFramework.SampleWebApp.csproj",
        "samples/ExperimentFramework.SchemaStampingSample/ExperimentFramework.SchemaStampingSample.csproj",
        "samples/ExperimentFramework.ScientificDemo/ExperimentFramework.ScientificDemo.csproj",
        "samples/ExperimentFramework.ScientificSample/ExperimentFramework.ScientificSample.csproj",
        "samples/ExperimentFramework.SimulationSample/ExperimentFramework.SimulationSample.csproj",
        "src/ExperimentFramework.Admin/ExperimentFramework.Admin.csproj",
        "src/ExperimentFramework.Audit/ExperimentFramework.Audit.csproj",
        "src/ExperimentFramework.AutoStop/ExperimentFramework.AutoStop.csproj",
        "src/ExperimentFramework.Bandit/ExperimentFramework.Bandit.csproj",
        "src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj",
        "src/ExperimentFramework.Dashboard.Abstractions/ExperimentFramework.Dashboard.Abstractions.csproj",
        "src/ExperimentFramework.Dashboard.Analytics/ExperimentFramework.Dashboard.Analytics.csproj",
        "src/ExperimentFramework.Dashboard.Api/ExperimentFramework.Dashboard.Api.csproj",
        "src/ExperimentFramework.Dashboard.UI/ExperimentFramework.Dashboard.UI.csproj",
        "src/ExperimentFramework.Dashboard/ExperimentFramework.Dashboard.csproj",
        "src/ExperimentFramework.Data/ExperimentFramework.Data.csproj",
        "src/ExperimentFramework.DataPlane.Abstractions/ExperimentFramework.DataPlane.Abstractions.csproj",
        "src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj",
        "src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj",
        "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
        "src/ExperimentFramework.DataPlane/ExperimentFramework.DataPlane.csproj",
        "src/ExperimentFramework.Diagnostics/ExperimentFramework.Diagnostics.csproj",
        "src/ExperimentFramework.Distributed.Redis/ExperimentFramework.Distributed.Redis.csproj",
        "src/ExperimentFramework.Distributed/ExperimentFramework.Distributed.csproj",
        "src/ExperimentFramework.FeatureManagement/ExperimentFramework.FeatureManagement.csproj",
        "src/ExperimentFramework.Generators/ExperimentFramework.Generators.csproj",
        "src/ExperimentFramework.Governance.Persistence.Redis/ExperimentFramework.Governance.Persistence.Redis.csproj",
        "src/ExperimentFramework.Governance.Persistence.Sql/ExperimentFramework.Governance.Persistence.Sql.csproj",
        "src/ExperimentFramework.Governance.Persistence/ExperimentFramework.Governance.Persistence.csproj",
        "src/ExperimentFramework.Governance/ExperimentFramework.Governance.csproj",
        "src/ExperimentFramework.Metrics.Exporters/ExperimentFramework.Metrics.Exporters.csproj",
        "src/ExperimentFramework.OpenFeature/ExperimentFramework.OpenFeature.csproj",
        "src/ExperimentFramework.Plugins.Generators/ExperimentFramework.Plugins.Generators.csproj",
        "src/ExperimentFramework.Plugins/ExperimentFramework.Plugins.csproj",
        "src/ExperimentFramework.Resilience/ExperimentFramework.Resilience.csproj",
        "src/ExperimentFramework.Rollout/ExperimentFramework.Rollout.csproj",
        "src/ExperimentFramework.Science/ExperimentFramework.Science.csproj",
        "src/ExperimentFramework.Simulation/ExperimentFramework.Simulation.csproj",
        "src/ExperimentFramework.StickyRouting/ExperimentFramework.StickyRouting.csproj",
        "src/ExperimentFramework.Targeting/ExperimentFramework.Targeting.csproj",
        "src/ExperimentFramework.Testing/ExperimentFramework.Testing.csproj",
        "src/ExperimentFramework/ExperimentFramework.csproj",
        "tests/ExperimentFramework.Audit.Tests/ExperimentFramework.Audit.Tests.csproj",
        "tests/ExperimentFramework.Cli.Tests/ExperimentFramework.Cli.Tests.csproj",
        "tests/ExperimentFramework.Dashboard.Api.Tests/ExperimentFramework.Dashboard.Api.Tests.csproj",
        "tests/ExperimentFramework.Dashboard.Tests/ExperimentFramework.Dashboard.Tests.csproj",
        "tests/ExperimentFramework.Dashboard.UI.Tests/ExperimentFramework.Dashboard.UI.Tests.csproj",
        "tests/ExperimentFramework.DataPlane.AzureServiceBus.Tests/ExperimentFramework.DataPlane.AzureServiceBus.Tests.csproj",
        "tests/ExperimentFramework.DataPlane.Kafka.Tests/ExperimentFramework.DataPlane.Kafka.Tests.csproj",
        "tests/ExperimentFramework.DataPlane.SqlServer.Tests/ExperimentFramework.DataPlane.SqlServer.Tests.csproj",
        "tests/ExperimentFramework.DataPlane.Tests/ExperimentFramework.DataPlane.Tests.csproj",
        "tests/ExperimentFramework.Diagnostics.Tests/ExperimentFramework.Diagnostics.Tests.csproj",
        "tests/ExperimentFramework.E2E.Tests/ExperimentFramework.E2E.Tests.csproj",
        "tests/ExperimentFramework.Generators.Tests/ExperimentFramework.Generators.Tests.csproj",
        "tests/ExperimentFramework.Governance.Persistence.Redis.Tests/ExperimentFramework.Governance.Persistence.Redis.Tests.csproj",
        "tests/ExperimentFramework.Governance.Persistence.Sql.Tests/ExperimentFramework.Governance.Persistence.Sql.Tests.csproj",
        "tests/ExperimentFramework.Governance.Persistence.Tests/ExperimentFramework.Governance.Persistence.Tests.csproj",
        "tests/ExperimentFramework.Governance.Tests/ExperimentFramework.Governance.Tests.csproj",
        "tests/ExperimentFramework.Metrics.Exporters.Tests/ExperimentFramework.Metrics.Exporters.Tests.csproj",
        "tests/ExperimentFramework.Plugins.Generators.Tests/ExperimentFramework.Plugins.Generators.Tests.csproj",
        "tests/ExperimentFramework.Plugins.TestFixtures/ExperimentFramework.Plugins.TestFixtures.csproj",
        "tests/ExperimentFramework.Plugins.Tests/ExperimentFramework.Plugins.Tests.csproj",
        "tests/ExperimentFramework.Simulation.Tests/ExperimentFramework.Simulation.Tests.csproj",
        "tests/ExperimentFramework.StickyRouting.Tests/ExperimentFramework.StickyRouting.Tests.csproj",
        "tests/ExperimentFramework.Testing.Tests/ExperimentFramework.Testing.Tests.csproj",
        "tests/ExperimentFramework.Tests/ExperimentFramework.Tests.csproj",
        "tools/ExperimentFramework.Cli/ExperimentFramework.Cli.csproj",
        "tools/ExperimentFramework.SchemaGenerator/ExperimentFramework.SchemaGenerator.csproj"
      ],
      "largest_source_bytes": 114883,
      "source_files_sampled": 864,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 10836
    },
    "dependencies": {
      "manifests": [],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [],
        "collected": true,
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 139,
        "assessed_package": null,
        "unassessed_count": 2,
        "direct_affected_count": 0
      },
      "ecosystems": [],
      "dependencies": [
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.Audit/ExperimentFramework.Audit.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/ExperimentFramework.Audit/ExperimentFramework.Audit.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.AutoStop/ExperimentFramework.AutoStop.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Hosting.Abstractions",
          "manifest": "src/ExperimentFramework.AutoStop/ExperimentFramework.AutoStop.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.Bandit/ExperimentFramework.Bandit.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Configuration",
          "manifest": "src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Configuration.Binder",
          "manifest": "src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.FileProviders.Physical",
          "manifest": "src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Hosting.Abstractions",
          "manifest": "src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Options",
          "manifest": "src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "YamlDotNet",
          "manifest": "src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj",
          "ecosystem": "nuget",
          "version_constraint": "16.3.0"
        },
        {
          "name": "Microsoft.AspNetCore.Http.Abstractions",
          "manifest": "src/ExperimentFramework.Dashboard.Abstractions/ExperimentFramework.Dashboard.Abstractions.csproj",
          "ecosystem": "nuget",
          "version_constraint": "2.3.9"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.Data/ExperimentFramework.Data.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Azure.Messaging.ServiceBus",
          "manifest": "src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "7.20.1"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Options",
          "manifest": "src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Confluent.Kafka",
          "manifest": "src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj",
          "ecosystem": "nuget",
          "version_constraint": "2.12.0"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Options",
          "manifest": "src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.EntityFrameworkCore",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "8.0.11"
        },
        {
          "name": "Microsoft.EntityFrameworkCore.Design",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "8.0.11"
        },
        {
          "name": "Microsoft.EntityFrameworkCore.SqlServer",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "8.0.11"
        },
        {
          "name": "Microsoft.EntityFrameworkCore",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "9.0.0"
        },
        {
          "name": "Microsoft.EntityFrameworkCore.Design",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "9.0.0"
        },
        {
          "name": "Microsoft.EntityFrameworkCore.SqlServer",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "9.0.0"
        },
        {
          "name": "Microsoft.EntityFrameworkCore",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "10.0.1"
        },
        {
          "name": "Microsoft.EntityFrameworkCore.Design",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "10.0.1"
        },
        {
          "name": "Microsoft.EntityFrameworkCore.SqlServer",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "10.0.1"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Options",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "System.Security.Cryptography.Xml",
          "manifest": "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
          "ecosystem": "nuget",
          "version_constraint": "9.0.18"
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/ExperimentFramework.DataPlane/ExperimentFramework.DataPlane.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Options",
          "manifest": "src/ExperimentFramework.DataPlane/ExperimentFramework.DataPlane.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.DataPlane/ExperimentFramework.DataPlane.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.Logging.Abstractions",
          "manifest": "src/ExperimentFramework.Diagnostics/ExperimentFramework.Diagnostics.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.Diagnostics/ExperimentFramework.Diagnostics.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.Distributed.Redis/ExperimentFramework.Distributed.Redis.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "StackExchange.Redis",
          "manifest": "src/ExperimentFramework.Distributed.Redis/ExperimentFramework.Distributed.Redis.csproj",
          "ecosystem": "nuget",
          "version_constraint": "2.10.1"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.Distributed/ExperimentFramework.Distributed.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        },
        {
          "name": "Microsoft.FeatureManagement",
          "manifest": "src/ExperimentFramework.FeatureManagement/ExperimentFramework.FeatureManagement.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftFeatureManagementVersion)"
        },
        {
          "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
          "manifest": "src/ExperimentFramework.FeatureManagement/ExperimentFramework.FeatureManagement.csproj",
          "ecosystem": "nuget",
          "version_constraint": "$(MicrosoftExtensionsVersion)"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "Azure.Messaging.ServiceBus",
            "direct": true,
            "version": "7.20.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Confluent.Kafka",
            "direct": true,
            "version": "2.12.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.AspNetCore.Http.Abstractions",
            "direct": true,
            "version": "2.3.9",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore",
            "direct": true,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore",
            "direct": true,
            "version": "8.0.11",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore",
            "direct": true,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.Design",
            "direct": true,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.Design",
            "direct": true,
            "version": "8.0.11",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.Design",
            "direct": true,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.Design",
            "direct": true,
            "version": "9.0.11",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.SqlServer",
            "direct": true,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.SqlServer",
            "direct": true,
            "version": "8.0.11",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.SqlServer",
            "direct": true,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Configuration",
            "direct": true,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Configuration.Binder",
            "direct": true,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Configuration.Binder",
            "direct": true,
            "version": "8.0.2",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.DependencyInjection.Abstractions",
            "direct": true,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.FileProviders.Physical",
            "direct": true,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Hosting.Abstractions",
            "direct": true,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Hosting.Abstractions",
            "direct": true,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Logging.Abstractions",
            "direct": true,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Options",
            "direct": true,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Options",
            "direct": true,
            "version": "8.0.2",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.FeatureManagement",
            "direct": true,
            "version": "4.4.0",
            "ecosystem": "nuget"
          },
          {
            "name": "StackExchange.Redis",
            "direct": true,
            "version": "2.10.1",
            "ecosystem": "nuget"
          },
          {
            "name": "StackExchange.Redis",
            "direct": true,
            "version": "2.8.16",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Security.Cryptography.Xml",
            "direct": true,
            "version": "9.0.18",
            "ecosystem": "nuget"
          },
          {
            "name": "YamlDotNet",
            "direct": true,
            "version": "16.3.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Azure.Core",
            "direct": false,
            "version": "1.46.2",
            "ecosystem": "nuget"
          },
          {
            "name": "Azure.Core.Amqp",
            "direct": false,
            "version": "1.3.1",
            "ecosystem": "nuget"
          },
          {
            "name": "BenchmarkDotNet",
            "direct": false,
            "version": "0.15.8",
            "ecosystem": "nuget"
          },
          {
            "name": "bunit",
            "direct": false,
            "version": "2.7.2",
            "ecosystem": "nuget"
          },
          {
            "name": "coverlet.collector",
            "direct": false,
            "version": "6.0.4",
            "ecosystem": "nuget"
          },
          {
            "name": "FluentAssertions",
            "direct": false,
            "version": "6.12.2",
            "ecosystem": "nuget"
          },
          {
            "name": "FluentAssertions",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Humanizer.Core",
            "direct": false,
            "version": "2.14.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Markdig",
            "direct": false,
            "version": "0.44.0",
            "ecosystem": "nuget"
          },
          {
            "name": "MathNet.Numerics",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.AspNetCore.Http.Features",
            "direct": false,
            "version": "2.3.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.AspNetCore.Identity.EntityFrameworkCore",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.AspNetCore.Mvc.Testing",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.AspNetCore.OpenApi",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Azure.Amqp",
            "direct": false,
            "version": "2.7.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Bcl.AsyncInterfaces",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Bcl.AsyncInterfaces",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Bcl.TimeProvider",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.CodeAnalysis.Analyzers",
            "direct": false,
            "version": "3.11.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.CodeAnalysis.Common",
            "direct": false,
            "version": "4.14.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.CodeAnalysis.CSharp",
            "direct": false,
            "version": "4.14.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.CodeAnalysis.CSharp.Analyzer.Testing.XUnit",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.CodeAnalysis.CSharp.CodeFix.Testing.XUnit",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.CodeAnalysis.CSharp.SourceGenerators.Testing.XUnit",
            "direct": false,
            "version": "1.1.2",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.CodeAnalysis.CSharp.Workspaces",
            "direct": false,
            "version": "4.14.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.CodeAnalysis.Workspaces.Common",
            "direct": false,
            "version": "4.14.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.InMemory",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.Relational",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.Relational",
            "direct": false,
            "version": "8.0.11",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.Relational",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.Sqlite",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.EntityFrameworkCore.Sqlite",
            "direct": false,
            "version": "9.0.11",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Caching.Abstractions",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Caching.Memory",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Caching.Memory",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Configuration.Abstractions",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Configuration.Json",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Configuration.Json",
            "direct": false,
            "version": "10.0.2",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.DependencyInjection",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Diagnostics.Abstractions",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.FileProviders.Abstractions",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.FileSystemGlobbing",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Hosting",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Hosting",
            "direct": false,
            "version": "10.0.2",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Http.Resilience",
            "direct": false,
            "version": "10.1.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Logging",
            "direct": false,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Logging",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Logging",
            "direct": false,
            "version": "8.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Logging.Console",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Primitives",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.Primitives",
            "direct": false,
            "version": "8.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Extensions.ServiceDiscovery",
            "direct": false,
            "version": "10.1.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.FeatureManagement.AspNetCore",
            "direct": false,
            "version": "4.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.FeatureManagement.AspNetCore",
            "direct": false,
            "version": "4.4.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.NET.Test.Sdk",
            "direct": false,
            "version": "17.12.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.NET.Test.Sdk",
            "direct": false,
            "version": "17.14.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.NET.Test.Sdk",
            "direct": false,
            "version": "17.14.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.NETCore.Platforms",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.Playwright",
            "direct": false,
            "version": "1.59.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Moq",
            "direct": false,
            "version": "4.20.72",
            "ecosystem": "nuget"
          },
          {
            "name": "NETStandard.Library",
            "direct": false,
            "version": "2.0.3",
            "ecosystem": "nuget"
          },
          {
            "name": "NSubstitute",
            "direct": false,
            "version": "5.3.0",
            "ecosystem": "nuget"
          },
          {
            "name": "NUnit",
            "direct": false,
            "version": "4.3.2",
            "ecosystem": "nuget"
          },
          {
            "name": "NUnit.Analyzers",
            "direct": false,
            "version": "4.7.0",
            "ecosystem": "nuget"
          },
          {
            "name": "NUnit3TestAdapter",
            "direct": false,
            "version": "5.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "OpenFeature",
            "direct": false,
            "version": "2.11.1",
            "ecosystem": "nuget"
          },
          {
            "name": "OpenTelemetry",
            "direct": false,
            "version": "1.14.0",
            "ecosystem": "nuget"
          },
          {
            "name": "OpenTelemetry.Exporter.Console",
            "direct": false,
            "version": "1.14.0",
            "ecosystem": "nuget"
          },
          {
            "name": "OpenTelemetry.Exporter.OpenTelemetryProtocol",
            "direct": false,
            "version": "1.15.3",
            "ecosystem": "nuget"
          },
          {
            "name": "OpenTelemetry.Extensions.Hosting",
            "direct": false,
            "version": "1.14.0",
            "ecosystem": "nuget"
          },
          {
            "name": "OpenTelemetry.Instrumentation.AspNetCore",
            "direct": false,
            "version": "1.14.0",
            "ecosystem": "nuget"
          },
          {
            "name": "OpenTelemetry.Instrumentation.Http",
            "direct": false,
            "version": "1.14.0",
            "ecosystem": "nuget"
          },
          {
            "name": "OpenTelemetry.Instrumentation.Runtime",
            "direct": false,
            "version": "1.14.0",
            "ecosystem": "nuget"
          },
          {
            "name": "PatternKit.Core",
            "direct": false,
            "version": "0.147.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Pipelines.Sockets.Unofficial",
            "direct": false,
            "version": "2.2.8",
            "ecosystem": "nuget"
          },
          {
            "name": "Polly",
            "direct": false,
            "version": "8.6.5",
            "ecosystem": "nuget"
          },
          {
            "name": "Polly.Core",
            "direct": false,
            "version": "8.6.5",
            "ecosystem": "nuget"
          },
          {
            "name": "Reqnroll",
            "direct": false,
            "version": "3.3.4",
            "ecosystem": "nuget"
          },
          {
            "name": "Reqnroll.xUnit",
            "direct": false,
            "version": "3.3.4",
            "ecosystem": "nuget"
          },
          {
            "name": "Swashbuckle.AspNetCore",
            "direct": false,
            "version": "7.2.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Buffers",
            "direct": false,
            "version": "4.5.1",
            "ecosystem": "nuget"
          },
          {
            "name": "System.ClientModel",
            "direct": false,
            "version": "1.4.2",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Collections.Immutable",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.CommandLine",
            "direct": false,
            "version": "2.0.0-beta4.22272.1",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Composition",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Composition.AttributedModel",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Composition.Convention",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Composition.Hosting",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Composition.Runtime",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Composition.TypedParts",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Diagnostics.DiagnosticSource",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "System.IdentityModel.Tokens.Jwt",
            "direct": false,
            "version": "8.15.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.IO.Hashing",
            "direct": false,
            "version": "9.0.10",
            "ecosystem": "nuget"
          },
          {
            "name": "System.IO.Pipelines",
            "direct": false,
            "version": "5.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "System.IO.Pipelines",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Memory",
            "direct": false,
            "version": "4.5.5",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Memory.Data",
            "direct": false,
            "version": "6.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Numerics.Vectors",
            "direct": false,
            "version": "4.5.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Reflection.Metadata",
            "direct": false,
            "version": "9.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Runtime.CompilerServices.Unsafe",
            "direct": false,
            "version": "6.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Text.Encoding.CodePages",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Text.Json",
            "direct": false,
            "version": "10.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Threading.Channels",
            "direct": false,
            "version": "7.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Threading.Tasks.Extensions",
            "direct": false,
            "version": "4.5.4",
            "ecosystem": "nuget"
          },
          {
            "name": "Testcontainers.Redis",
            "direct": false,
            "version": "4.10.0",
            "ecosystem": "nuget"
          },
          {
            "name": "TinyBDD.Xunit",
            "direct": false,
            "version": "0.14.3",
            "ecosystem": "nuget"
          },
          {
            "name": "TinyBDD.Xunit",
            "direct": false,
            "version": "0.18.1",
            "ecosystem": "nuget"
          },
          {
            "name": "xunit",
            "direct": false,
            "version": "2.9.2",
            "ecosystem": "nuget"
          },
          {
            "name": "xunit",
            "direct": false,
            "version": "2.9.3",
            "ecosystem": "nuget"
          },
          {
            "name": "xunit.runner.visualstudio",
            "direct": false,
            "version": "2.8.2",
            "ecosystem": "nuget"
          },
          {
            "name": "xunit.runner.visualstudio",
            "direct": false,
            "version": "3.1.4",
            "ecosystem": "nuget"
          },
          {
            "name": "xunit.runner.visualstudio",
            "direct": false,
            "version": "3.1.5",
            "ecosystem": "nuget"
          },
          {
            "name": "Xunit.SkippableFact",
            "direct": false,
            "version": "1.5.61",
            "ecosystem": "nuget"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 141,
        "direct_count": 28,
        "indirect_count": 113
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 2,
        "merged_prs": 95,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 17,
        "closed_unmerged_prs": 2
      },
      "bus_factor": 1,
      "bot_contributors": 3,
      "top_contributors": [
        {
          "type": "User",
          "login": "JerrettDavis",
          "commits": 54,
          "avatar_url": "https://avatars.githubusercontent.com/u/2610199?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "codeql-analysis.yml",
        "conventional-commits.yml",
        "dependency-review.yml",
        "docs-screenshots.yml",
        "docs.yml",
        "labeler.yml",
        "stale.yml",
        "update-packages.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "packages.lock.json"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/8 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 9,
            "reason": "SAST tool detected but not run on all commits",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "14 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "d4289640c9f220f0847a471a9a8af92275f96125",
        "ran_at": "2026-07-21T18:35:00Z",
        "aggregate_score": 4.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": true,
      "has_security_policy": false,
      "has_dependabot_config": true
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/JerrettDavis/ExperimentFramework",
    "host": "github.com",
    "name": "ExperimentFramework",
    "owner": "JerrettDavis"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 64,
      "inputs": {
        "security": 58,
        "vitality": 83,
        "community": 35,
        "governance": 60,
        "engineering": 81
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 83,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "commits_last_year": 135,
              "human_commit_share": 0.67,
              "days_since_last_push": 0,
              "active_weeks_last_year": 20
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "20/52 weeks with commits",
                "points": 13.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 20
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "135 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 135
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 60,
              "latest_release_tag": "v0.23.12",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "60 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 60
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 18,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 18 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 18
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 35,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 1,
              "stars": 1,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 57,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 57,
            "inputs": {
              "packages": [
                "ExperimentFramework.Dashboard",
                "ExperimentFramework.DataPlane",
                "ExperimentFramework.Diagnostics",
                "ExperimentFramework.Dashboard.UI",
                "ExperimentFramework.Configuration",
                "ExperimentFramework.Dashboard.Api",
                "ExperimentFramework.Dashboard.Abstractions",
                "ExperimentFramework.DataPlane.Abstractions"
              ],
              "dependents": null,
              "ecosystems": "nuget",
              "total_downloads": 24817,
              "monthly_downloads": null
            },
            "components": [
              {
                "key": "total_downloads",
                "name": "Total downloads",
                "detail": "24,817 downloads all-time across nuget",
                "points": 45.7,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_total",
                    "params": {
                      "count": 24817,
                      "ecosystems": "nuget"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 60,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "merged_prs": 95,
              "open_issues": 0,
              "closed_issues": 17,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 2
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "95/97 decided PRs merged",
                "points": 37.5,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 95,
                      "decided": 97
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/8 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 64,
            "inputs": {
              "followers": 155,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "JerrettDavis",
              "public_repos": 125,
              "account_age_days": 5021
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "155 followers of JerrettDavis",
                "points": 15.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 155,
                      "login": "JerrettDavis"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "125 public repos, account ~13 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 125
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 13
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "ExperimentFramework.Dashboard",
                "ExperimentFramework.DataPlane",
                "ExperimentFramework.Diagnostics",
                "ExperimentFramework.Dashboard.UI",
                "ExperimentFramework.Configuration",
                "ExperimentFramework.Dashboard.Api",
                "ExperimentFramework.Dashboard.Abstractions",
                "ExperimentFramework.DataPlane.Abstractions"
              ],
              "ecosystems": "nuget",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "8 package(s) on nuget",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 8,
                      "ecosystems": "nuget"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "51 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 51
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 81,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "9 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "ab-testing",
                "csharp",
                "dotnet",
                "experimentation",
                "feature-flags",
                "nuget",
                "observability"
              ],
              "has_wiki": true,
              "homepage": "https://jerrettdavis.github.io/ExperimentFramework/",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://jerrettdavis.github.io/ExperimentFramework/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "7 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 7
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 58,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 47,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 4.7
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "23 out of 23 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/8 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool detected but not run on all commits",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "14 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 139 resolved dependencies against OSV; 2 could not be assessed (no resolved version, an unsupported ecosystem, or beyond the reported package list). This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 139
                }
              },
              {
                "code": "advisories_unassessed",
                "params": {
                  "count": 2
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 139,
              "unassessed_packages": 2,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 139,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 76,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 10836
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "67 of 67 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 67,
                      "sampled": 67
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "packages.lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.44,
              "toolchain_manifests": [
                "benchmarks/ExperimentFramework.Benchmarks/ExperimentFramework.Benchmarks.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.ApiService/AspireDemo.ApiService.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.AppHost/AspireDemo.AppHost.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Contracts/AspireDemo.Blog.Contracts.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Auth/AspireDemo.Blog.Plugins.Auth.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Data/AspireDemo.Blog.Plugins.Data.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Editor/AspireDemo.Blog.Plugins.Editor.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog.Plugins.Syndication/AspireDemo.Blog.Plugins.Syndication.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.Blog/AspireDemo.Blog.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.E2ETests/AspireDemo.E2ETests.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.ServiceDefaults/AspireDemo.ServiceDefaults.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.Web.Tests/AspireDemo.Web.Tests.csproj",
                "samples/ExperimentFramework.AspireDemo/AspireDemo.Web/AspireDemo.Web.csproj",
                "samples/ExperimentFramework.BanditOptimizer/ExperimentFramework.BanditOptimizer.csproj",
                "samples/ExperimentFramework.ComprehensiveSample/ExperimentFramework.ComprehensiveSample.csproj",
                "samples/ExperimentFramework.DashboardHost/ExperimentFramework.DashboardHost.csproj",
                "samples/ExperimentFramework.DataPlaneSample/ExperimentFramework.DataPlaneSample.csproj",
                "samples/ExperimentFramework.FeatureFlagDemo/ExperimentFramework.FeatureFlagDemo.csproj",
                "samples/ExperimentFramework.GovernanceSample/ExperimentFramework.GovernanceSample.csproj",
                "samples/ExperimentFramework.OpenTelemetryDataPlaneSample/ExperimentFramework.OpenTelemetryDataPlaneSample.csproj",
                "samples/ExperimentFramework.PluginHostSample/ExperimentFramework.PluginHostSample.csproj",
                "samples/ExperimentFramework.ResilienceDemo/ExperimentFramework.ResilienceDemo.csproj",
                "samples/ExperimentFramework.SampleConsole/ExperimentFramework.SampleConsole.csproj",
                "samples/ExperimentFramework.SamplePlugin/ExperimentFramework.SamplePlugin.csproj",
                "samples/ExperimentFramework.SampleWebApp/ExperimentFramework.SampleWebApp.csproj",
                "samples/ExperimentFramework.SchemaStampingSample/ExperimentFramework.SchemaStampingSample.csproj",
                "samples/ExperimentFramework.ScientificDemo/ExperimentFramework.ScientificDemo.csproj",
                "samples/ExperimentFramework.ScientificSample/ExperimentFramework.ScientificSample.csproj",
                "samples/ExperimentFramework.SimulationSample/ExperimentFramework.SimulationSample.csproj",
                "src/ExperimentFramework.Admin/ExperimentFramework.Admin.csproj",
                "src/ExperimentFramework.Audit/ExperimentFramework.Audit.csproj",
                "src/ExperimentFramework.AutoStop/ExperimentFramework.AutoStop.csproj",
                "src/ExperimentFramework.Bandit/ExperimentFramework.Bandit.csproj",
                "src/ExperimentFramework.Configuration/ExperimentFramework.Configuration.csproj",
                "src/ExperimentFramework.Dashboard.Abstractions/ExperimentFramework.Dashboard.Abstractions.csproj",
                "src/ExperimentFramework.Dashboard.Analytics/ExperimentFramework.Dashboard.Analytics.csproj",
                "src/ExperimentFramework.Dashboard.Api/ExperimentFramework.Dashboard.Api.csproj",
                "src/ExperimentFramework.Dashboard.UI/ExperimentFramework.Dashboard.UI.csproj",
                "src/ExperimentFramework.Dashboard/ExperimentFramework.Dashboard.csproj",
                "src/ExperimentFramework.Data/ExperimentFramework.Data.csproj",
                "src/ExperimentFramework.DataPlane.Abstractions/ExperimentFramework.DataPlane.Abstractions.csproj",
                "src/ExperimentFramework.DataPlane.AzureServiceBus/ExperimentFramework.DataPlane.AzureServiceBus.csproj",
                "src/ExperimentFramework.DataPlane.Kafka/ExperimentFramework.DataPlane.Kafka.csproj",
                "src/ExperimentFramework.DataPlane.SqlServer/ExperimentFramework.DataPlane.SqlServer.csproj",
                "src/ExperimentFramework.DataPlane/ExperimentFramework.DataPlane.csproj",
                "src/ExperimentFramework.Diagnostics/ExperimentFramework.Diagnostics.csproj",
                "src/ExperimentFramework.Distributed.Redis/ExperimentFramework.Distributed.Redis.csproj",
                "src/ExperimentFramework.Distributed/ExperimentFramework.Distributed.csproj",
                "src/ExperimentFramework.FeatureManagement/ExperimentFramework.FeatureManagement.csproj",
                "src/ExperimentFramework.Generators/ExperimentFramework.Generators.csproj",
                "src/ExperimentFramework.Governance.Persistence.Redis/ExperimentFramework.Governance.Persistence.Redis.csproj",
                "src/ExperimentFramework.Governance.Persistence.Sql/ExperimentFramework.Governance.Persistence.Sql.csproj",
                "src/ExperimentFramework.Governance.Persistence/ExperimentFramework.Governance.Persistence.csproj",
                "src/ExperimentFramework.Governance/ExperimentFramework.Governance.csproj",
                "src/ExperimentFramework.Metrics.Exporters/ExperimentFramework.Metrics.Exporters.csproj",
                "src/ExperimentFramework.OpenFeature/ExperimentFramework.OpenFeature.csproj",
                "src/ExperimentFramework.Plugins.Generators/ExperimentFramework.Plugins.Generators.csproj",
                "src/ExperimentFramework.Plugins/ExperimentFramework.Plugins.csproj",
                "src/ExperimentFramework.Resilience/ExperimentFramework.Resilience.csproj",
                "src/ExperimentFramework.Rollout/ExperimentFramework.Rollout.csproj",
                "src/ExperimentFramework.Science/ExperimentFramework.Science.csproj",
                "src/ExperimentFramework.Simulation/ExperimentFramework.Simulation.csproj",
                "src/ExperimentFramework.StickyRouting/ExperimentFramework.StickyRouting.csproj",
                "src/ExperimentFramework.Targeting/ExperimentFramework.Targeting.csproj",
                "src/ExperimentFramework.Testing/ExperimentFramework.Testing.csproj",
                "src/ExperimentFramework/ExperimentFramework.csproj",
                "tests/ExperimentFramework.Audit.Tests/ExperimentFramework.Audit.Tests.csproj",
                "tests/ExperimentFramework.Cli.Tests/ExperimentFramework.Cli.Tests.csproj",
                "tests/ExperimentFramework.Dashboard.Api.Tests/ExperimentFramework.Dashboard.Api.Tests.csproj",
                "tests/ExperimentFramework.Dashboard.Tests/ExperimentFramework.Dashboard.Tests.csproj",
                "tests/ExperimentFramework.Dashboard.UI.Tests/ExperimentFramework.Dashboard.UI.Tests.csproj",
                "tests/ExperimentFramework.DataPlane.AzureServiceBus.Tests/ExperimentFramework.DataPlane.AzureServiceBus.Tests.csproj",
                "tests/ExperimentFramework.DataPlane.Kafka.Tests/ExperimentFramework.DataPlane.Kafka.Tests.csproj",
                "tests/ExperimentFramework.DataPlane.SqlServer.Tests/ExperimentFramework.DataPlane.SqlServer.Tests.csproj",
                "tests/ExperimentFramework.DataPlane.Tests/ExperimentFramework.DataPlane.Tests.csproj",
                "tests/ExperimentFramework.Diagnostics.Tests/ExperimentFramework.Diagnostics.Tests.csproj",
                "tests/ExperimentFramework.E2E.Tests/ExperimentFramework.E2E.Tests.csproj",
                "tests/ExperimentFramework.Generators.Tests/ExperimentFramework.Generators.Tests.csproj",
                "tests/ExperimentFramework.Governance.Persistence.Redis.Tests/ExperimentFramework.Governance.Persistence.Redis.Tests.csproj",
                "tests/ExperimentFramework.Governance.Persistence.Sql.Tests/ExperimentFramework.Governance.Persistence.Sql.Tests.csproj",
                "tests/ExperimentFramework.Governance.Persistence.Tests/ExperimentFramework.Governance.Persistence.Tests.csproj",
                "tests/ExperimentFramework.Governance.Tests/ExperimentFramework.Governance.Tests.csproj",
                "tests/ExperimentFramework.Metrics.Exporters.Tests/ExperimentFramework.Metrics.Exporters.Tests.csproj",
                "tests/ExperimentFramework.Plugins.Generators.Tests/ExperimentFramework.Plugins.Generators.Tests.csproj",
                "tests/ExperimentFramework.Plugins.TestFixtures/ExperimentFramework.Plugins.TestFixtures.csproj",
                "tests/ExperimentFramework.Plugins.Tests/ExperimentFramework.Plugins.Tests.csproj",
                "tests/ExperimentFramework.Simulation.Tests/ExperimentFramework.Simulation.Tests.csproj",
                "tests/ExperimentFramework.StickyRouting.Tests/ExperimentFramework.StickyRouting.Tests.csproj",
                "tests/ExperimentFramework.Testing.Tests/ExperimentFramework.Testing.Tests.csproj",
                "tests/ExperimentFramework.Tests/ExperimentFramework.Tests.csproj",
                "tools/ExperimentFramework.Cli/ExperimentFramework.Cli.csproj",
                "tools/ExperimentFramework.SchemaGenerator/ExperimentFramework.SchemaGenerator.csproj"
              ],
              "dependency_bot_commit_share": 0.29
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "benchmarks/ExperimentFramework.Benchmarks/ExperimentFramework.Benchmarks.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.ApiService/AspireDemo.ApiService.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.AppHost/AspireDemo.AppHost.csproj (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "benchmarks/ExperimentFramework.Benchmarks/ExperimentFramework.Benchmarks.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.ApiService/AspireDemo.ApiService.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.AppHost/AspireDemo.AppHost.csproj"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "C# (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "44 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 44,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "29 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 29,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "C#",
              "largest_source_bytes": 114883,
              "source_files_sampled": 864,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "C# (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/864 source files over 60KB",
                "points": 54.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 864,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "demos",
                "samples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "demos, samples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "demos, samples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [],
  "report_type": "repository",
  "generated_at": "2026-07-21T18:35:22.180480Z",
  "schema_version": "0.23.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/j/JerrettDavis/ExperimentFramework.svg",
  "full_name": "JerrettDavis/ExperimentFramework",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.23.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsNuGet.