Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.23.0 · метрики 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 зірка⑂ 1 форкз груд. 2025 р.Переглянути на GitHub ↗

JerrettDavis/ExperimentFramework має індекс здоров’я 64 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (83/100), найнижчий — Community & Adoption (35/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

64
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

64
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

JD DavisОсобистий обліковий запис
155 підписників125 публічних репозиторіївз жовт. 2012 р.

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Пакетні екосистеми

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

83Добрий · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
13.8/36Ритм комітів — 20/52 тижнів із комітами
18/18Обсяг комітів — 135 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year135
human_commit_share0,67
days_since_last_push0
active_weeks_last_year20
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 60 релізів
36/36Свіжість релізів — останній реліз 0 дн. тому
27/27Ритм релізів — реліз кожні ~4 дн.
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Використані вхідні дані
releases_count60
latest_release_tagv0.23.12
releases_from_tagsні
days_since_latest_release0
mean_days_between_releases4

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

35У зоні ризику · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 1 зірок
0/25Форки — 1 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks1
stars1
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateтак
Як обчислюється оцінка
45.7/80Сумарні завантаження — 24 817 завантажень за весь час у nuget
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
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
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

60Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
46.8/46.8Вирішення issue — закрито 100% issue
37.5/38.3Прийняття PR — злито 95/97 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/8 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs95
open_issues0
closed_issues17
issue_closed_ratio1
closed_unmerged_prs2
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
15.8/25Охоплення власника — 155 підписників у JerrettDavis
25/25Послужний список — 125 публічних репозиторіїв, вік облікового запису ~13 р.
Використані вхідні дані
followers155
owner_typeUser
is_verified
owner_loginJerrettDavis
public_repos125
account_age_days5 021
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 8 пакет(ів) у nuget
35/35Свіжість публікацій — остання публікація 0 дн. тому
20/20Історія версій — 51 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesExperimentFramework.Dashboard, ExperimentFramework.DataPlane, ExperimentFramework.Diagnostics, ExperimentFramework.Dashboard.UI, ExperimentFramework.Configuration, ExperimentFramework.Dashboard.Api, ExperimentFramework.Dashboard.Abstractions, ExperimentFramework.DataPlane.Abstractions
ecosystemsnuget
any_deprecatedні
min_days_since_publish0

Інженерна якість

Чи наявні базові інженерні практики та документація?

81Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 9 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 23 out of 23 merged PRs checked by a CI test -- score normalized to 10
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

Документація

100Відмінний
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://jerrettdavis.github.io/ExperimentFramework/
10/10Опис репозиторію
10/10Теми — 7 тем
10/10Wiki
Використані вхідні дані
topicsab-testing, csharp, dotnet, experimentation, feature-flags, nuget, observability
has_wikiтак
homepagehttps://jerrettdavis.github.io/ExperimentFramework/
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

58Помірний · 16% загального індексу

Стан безпеки

47У зоні ризику
Як обчислюється оцінка
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.5Ліцензія — 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
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4,7
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
0/25Непрямі залежності без відомих сповіщень — транзитивний набір не відокремлюється від залежностей розробки й тестування в цьому обсязі
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories0
affected_packages0
assessed_packages139
unassessed_packages2
affected_by_severitynone
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Непрямі залежності без відомих сповіщень, Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено 139 резолвлених залежностей із OSV. 2 не вдалося оцінити — немає резолвленої версії, непідтримувана екосистема або поза межами звітованого переліку пакетів. Цей репозиторій не публікує пакета, який резолвить індекс, тож натомість оцінено граф залежностей репозиторію. Цей граф змішує закріплені версії для розробки й тестування зі справді постачаними залежностями, тож оцінюються лише задекларовані runtime-залежності; транзитивні знахідки подаються як контекст і в оцінку не входять. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

76Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 67 з 67 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes10 836
Як обчислюється оцінка
12.6/18Розгортання однією командою — benchmarks/ExperimentFramework.Benchmarks/ExperimentFramework.Benchmarks.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.ApiService/AspireDemo.ApiService.csproj, samples/ExperimentFramework.AspireDemo/AspireDemo.AppHost/AspireDemo.AppHost.csproj (домовленість інструментарію, без раннера задач)
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — C# (статично типізована)
10/10Відтворюване середовище — lockfile
10/10Підтверджена практика роботи з агентами — 44 з останніх 100 комітів створено агентом або з його зазначенням
8/8Автоматизоване супроводження — 29 з останніх 100 комітів — автоматичні оновлення залежностей
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilespackages.lock.json
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configні
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
Як обчислюється оцінка
45/45Типізований код — C# (статично типізована)
54.9/55Керовані розміри файлів — 1/864 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageC#
largest_source_bytes114 883
source_files_sampled864
oversized_source_files1
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — demos, samples
Використані вхідні дані
example_dirsdemos, samples
has_mcp_signalні
api_schema_files

Ключові факти

1зірок GitHub
1контриб'юторів
135комітів за останні 12 місяців
0днів від останнього пушу
60релізів
1бас-фактор
0відкритих issue
пакетних екосистем

Докладніше

Історія зірок і форків 1 ★ / 1 ⇿
1Зірки
1Форки
1Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

0001111112026-012026-012026-01
Мажорні 0Мінорні 0Патчі 1
OpenSSF Scorecard 4.7 / 10
4.7сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).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
Прямі залежності 45
РеєстрПакетОбмеження версіїМаніфест
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
Усі залежності 141

Повний розв'язаний набір залежностей із графа залежностей GitHub: 28 прямих і 113 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

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

Цей репозиторій не публікує пакета, який розпізнає індекс, тож оцінено його власний граф залежностей — 139 пакетів, серед яких є й піниї розробки та тестування, що ніколи не постачаються: 0 мають відомі сповіщення, з них 0 прямі. 2 не вдалося оцінити — немає резолвленої версії, непідтримувана екосистема або поза наведеним переліком пакетів.

Жодне відоме сповіщення не стосується оцінених залежностей.

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "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"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.23.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаNuGet.