Öffentliches Register
Software-GesundheitsberichtSchema 0.23.0 · Metriken 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 Stern⑂ 1 Forkseit Dez. 2025Auf GitHub ansehen ↗

JerrettDavis/ExperimentFramework erreicht einen Gesundheitsindex von 64 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (83/100) ab, am schwächsten bei Community & Adoption (35/100). Zuletzt heute aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

64
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

64
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

JD DavisPersönliches Konto
155 Follower125 öffentliche Reposseit Okt. 2012

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

83Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 0 Tagen
13.8/36Commit-Rhythmus — 20/52 Wochen mit Commits
18/18Commit-Volumen — 135 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year135
human_commit_share0,67
days_since_last_push0
active_weeks_last_year20
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 60 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 0 Tagen
27/27Release-Rhythmus — ein Release etwa alle 4 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count60
latest_release_tagv0.23.12
releases_from_tagsnein
days_since_latest_release0
mean_days_between_releases4

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

35Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 1 Stars
0/25Forks — 1 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks1
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
6.3/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templateja
Wie die Bewertung erfolgt
45.7/80Downloads gesamt — 24.817 Downloads insgesamt über nuget
0/20Abhängige in der Registry — von diesem Ökosystem nicht ausgewiesen
Verwendete Eingangsdaten
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
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Abhängige in der Registry. Die verbleibenden Gewichte wurden renormalisiert.

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

60Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 100 % der Commits
1.4/13.5Breite der Beitragenden — 1 Beitragende
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled1
top_contributor_share1
Wie die Bewertung erfolgt
46.8/46.8Issue-Lösungsquote — 100 % der Issues geschlossen
37.5/38.3PR-Annahme — 95/97 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/8 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs95
open_issues0
closed_issues17
issue_closed_ratio1
closed_unmerged_prs2
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
15.8/25Reichweite des Inhabers — 155 Follower von JerrettDavis
25/25Kontohistorie — 125 öffentliche Repos, Kontoalter ca. 13 Jahre
Verwendete Eingangsdaten
followers155
owner_typeUser
is_verified
owner_loginJerrettDavis
public_repos125
account_age_days5.021
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 8 Paket(e) auf nuget
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 0 Tagen
20/20Versionshistorie — 51 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesExperimentFramework.Dashboard, ExperimentFramework.DataPlane, ExperimentFramework.Diagnostics, ExperimentFramework.Dashboard.UI, ExperimentFramework.Configuration, ExperimentFramework.Dashboard.Api, ExperimentFramework.Dashboard.Abstractions, ExperimentFramework.DataPlane.Abstractions
ecosystemsnuget
any_deprecatednein
min_days_since_publish0

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

81Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 9 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
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
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein

Dokumentation

100Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://jerrettdavis.github.io/ExperimentFramework/
10/10Repository-Beschreibung
10/10Topics — 7 Topics
10/10Wiki
Verwendete Eingangsdaten
topicsab-testing, csharp, dotnet, experimentation, feature-flags, nuget, observability
has_wikija
homepagehttps://jerrettdavis.github.io/ExperimentFramework/
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

58Mittel · 16 % des Gesamtindex

Sicherheitslage

47Gefährdet
Wie die Bewertung erfolgt
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.5Lizenz — 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
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4,7
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
0/25Indirekte Abhängigkeiten ohne bekannte Advisories — transitive Menge in diesem Bereich nicht von Entwicklungs- und Test-Abhängigkeiten trennbar
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories0
affected_packages0
assessed_packages139
unassessed_packages2
affected_by_severitynone
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Indirekte Abhängigkeiten ohne bekannte Advisories, Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. 139 aufgelöste Abhängigkeiten wurden mit OSV abgeglichen. 2 konnten nicht bewertet werden — keine aufgelöste Version, ein nicht unterstütztes Ökosystem oder außerhalb der ausgewiesenen Paketliste. Dieses Repository veröffentlicht kein Paket, das der Index auflöst; bewertet wurde daher der Abhängigkeitsgraph des Repositorys. Dieser Graph vermischt Entwicklungs- und Test-Pins mit ausgelieferten Abhängigkeiten, daher werden nur die deklarierten Laufzeit-Abhängigkeiten bewertet; transitive Befunde werden als Kontext ausgewiesen und fließen nicht in die Bewertung ein. Erreichbarkeit wird nicht analysiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

76Gut · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 67 von 67 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes10.836
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — benchmarks/ExperimentFramework.Benchmarks/ExperimentFramework.Benchmarks.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.ApiService/AspireDemo.ApiService.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.AppHost/AspireDemo.AppHost.csproj (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — C# (statisch typisiert)
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 44 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
8/8Automatisierte Wartung — 29 der letzten 100 Commits sind automatisierte Abhängigkeits-Updates
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilespackages.lock.json
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
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
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — C# (statisch typisiert)
54.9/55Handhabbare Dateigrößen — 1/864 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageC#
largest_source_bytes114.883
source_files_sampled864
oversized_source_files1
Wie die Bewertung erfolgt
0/40API-Schema (OpenAPI/GraphQL/proto)
0/20MCP-Server
40/40Lauffähige Beispiele — demos, samples
Verwendete Eingangsdaten
example_dirsdemos, samples
has_mcp_signalnein
api_schema_files

Eckdaten

1GitHub-Sterne
1Mitwirkende
135Commits, letzte 12 Monate
0Tage seit letztem Push
60Releases
1Bus-Faktor
0offene Issues
Paket-Ökosysteme

Weitere Details

Stern- und Fork-Verlauf 1 ★ / 1 ⇿
1Sterne
1Forks
1Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

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

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).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
Direkte Abhängigkeiten 45
RegistryPaketVersionsvorgabeManifest
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
Alle Abhängigkeiten 141

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 28 direkte und 113 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

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

Dieses Repository veröffentlicht kein vom Index auflösbares Paket, daher wurde sein eigener Abhängigkeitsgraph bewertet – 139 Pakete, darunter auch Entwicklungs- und Test-Pins, die nie ausgeliefert werden: 0 tragen bekannte Advisories, davon 0 direkte. 2 konnten nicht bewertet werden – keine aufgelöste Version, ein nicht unterstütztes Ökosystem, oder außerhalb der ausgewiesenen Paketliste.

Keine bekannten Advisories betreffen die bewerteten Abhängigkeiten.

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "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"
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.23.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenNuGet.