Informe JSON sin procesar legible por máquina
{
"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"
}