Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [
"hacktoberfest",
"csharp",
"openapi",
"hacktoberfest2025"
],
"is_fork": false,
"size_kb": 1672,
"has_wiki": true,
"homepage": null,
"languages": {
"C#": 995348,
"Shell": 1100,
"Dockerfile": 2190
},
"pushed_at": "2026-07-30T13:34:07Z",
"created_at": "2020-07-30T03:44:35Z",
"owner_type": "Organization",
"updated_at": "2026-07-30T13:14:49Z",
"description": "OpenAPI 3 SDK Generator for C#",
"is_archived": false,
"is_disabled": false,
"license_spdx": "Apache-2.0",
"default_branch": "main",
"license_spdx_raw": "Apache-2.0",
"primary_language": "C#",
"significant_languages": [
"C#"
]
},
"owner": {
"blog": "https://centeredgesoftware.com/",
"name": "CenterEdge Software",
"type": "Organization",
"login": "CenterEdge",
"company": null,
"location": "United States of America",
"followers": 9,
"avatar_url": "https://avatars.githubusercontent.com/u/7118733?v=4",
"created_at": "2014-03-31T18:16:43Z",
"is_verified": null,
"public_repos": 39,
"account_age_days": 4503
},
"license": {
"state": "standard",
"spdx_id": "Apache-2.0",
"raw_spdx": "Apache-2.0",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "release/0.7.0",
"kind": "other",
"published_at": "2026-07-30T13:34:07Z"
},
{
"tag": "release/0.7.0-beta.6",
"kind": "other",
"published_at": "2026-07-10T14:23:34Z"
},
{
"tag": "release/0.7.0-beta.5",
"kind": "other",
"published_at": "2026-07-09T13:46:45Z"
},
{
"tag": "release/0.7.0-beta.4",
"kind": "other",
"published_at": "2026-07-07T15:33:32Z"
},
{
"tag": "release/0.7.0-beta.3",
"kind": "other",
"published_at": "2026-06-30T17:33:15Z"
},
{
"tag": "release/0.7.0-beta.2",
"kind": "other",
"published_at": "2026-06-29T20:47:58Z"
},
{
"tag": "release/0.7.0-beta.1",
"kind": "other",
"published_at": "2026-06-26T13:14:42Z"
},
{
"tag": "release/0.6.4",
"kind": "other",
"published_at": "2026-06-25T14:25:26Z"
},
{
"tag": "release/0.6.3",
"kind": "other",
"published_at": "2026-02-17T13:37:39Z"
},
{
"tag": "release/0.6.2",
"kind": "other",
"published_at": "2025-12-03T18:35:52Z"
},
{
"tag": "release/0.6.1",
"kind": "other",
"published_at": "2025-07-08T16:39:12Z"
},
{
"tag": "release/0.6.0",
"kind": "other",
"published_at": "2025-05-23T12:32:43Z"
},
{
"tag": "release/0.6.0-beta0004",
"kind": "other",
"published_at": "2025-04-09T17:14:48Z"
},
{
"tag": "release/0.6.0-beta0003",
"kind": "other",
"published_at": "2025-04-08T19:19:06Z"
},
{
"tag": "release/0.6.0-beta0002",
"kind": "other",
"published_at": "2025-01-08T14:42:43Z"
},
{
"tag": "release/0.5.3",
"kind": "other",
"published_at": "2024-12-13T18:16:19Z"
},
{
"tag": "release/0.5.3-beta0001",
"kind": "other",
"published_at": "2024-12-13T17:39:09Z"
},
{
"tag": "release/0.6.0-beta0001",
"kind": "other",
"published_at": "2024-10-13T16:41:25Z"
},
{
"tag": "release/0.5.2",
"kind": "other",
"published_at": "2024-10-11T18:34:55Z"
},
{
"tag": "release/0.5.1",
"kind": "other",
"published_at": "2024-09-19T13:25:44Z"
},
{
"tag": "release/0.5.0",
"kind": "other",
"published_at": "2024-09-10T21:07:53Z"
},
{
"tag": "release/0.5.0-beta0003",
"kind": "other",
"published_at": "2024-08-05T12:11:51Z"
},
{
"tag": "release/0.5.0-beta0002",
"kind": "other",
"published_at": "2024-05-28T20:17:53Z"
},
{
"tag": "release/0.5.0-beta0001",
"kind": "other",
"published_at": "2024-05-28T14:57:12Z"
},
{
"tag": "release/0.4.1",
"kind": "other",
"published_at": "2023-11-21T16:52:16Z"
},
{
"tag": "release/0.3.8",
"kind": "other",
"published_at": "2023-11-21T16:44:31Z"
},
{
"tag": "release/0.4.0",
"kind": "other",
"published_at": "2023-08-29T16:59:50Z"
},
{
"tag": "release/0.3.7",
"kind": "other",
"published_at": "2023-08-16T20:38:14Z"
},
{
"tag": "release/0.3.6",
"kind": "other",
"published_at": "2023-07-14T13:46:45Z"
},
{
"tag": "release/0.3.5",
"kind": "other",
"published_at": "2023-06-16T21:30:29Z"
},
{
"tag": "release/0.3.4",
"kind": "other",
"published_at": "2023-05-19T15:52:25Z"
},
{
"tag": "release/0.3.4-beta0002",
"kind": "other",
"published_at": "2023-05-12T18:50:13Z"
},
{
"tag": "release/0.3.4-beta0001",
"kind": "other",
"published_at": "2023-03-17T18:53:07Z"
},
{
"tag": "release/0.3.3",
"kind": "other",
"published_at": "2023-03-16T18:42:47Z"
},
{
"tag": "release/0.3.3-beta0001",
"kind": "other",
"published_at": "2023-03-16T18:17:55Z"
},
{
"tag": "release/0.3.2",
"kind": "other",
"published_at": "2023-03-06T13:50:58Z"
},
{
"tag": "release/0.3.1",
"kind": "other",
"published_at": "2023-02-13T15:54:28Z"
},
{
"tag": "release/0.3.0",
"kind": "other",
"published_at": "2022-12-09T01:05:10Z"
},
{
"tag": "release/0.3.0-beta0002",
"kind": "other",
"published_at": "2022-11-04T14:45:48Z"
},
{
"tag": "release/0.3.0-beta001",
"kind": "other",
"published_at": "2022-08-31T15:00:46Z"
},
{
"tag": "release/0.2.0-alpha005",
"kind": "other",
"published_at": "2022-01-27T21:34:33Z"
},
{
"tag": "release/0.2.0-alpha004",
"kind": "other",
"published_at": "2022-01-24T19:54:08Z"
},
{
"tag": "release/0.2.0-alpha003",
"kind": "other",
"published_at": "2022-01-19T20:25:50Z"
},
{
"tag": "release/0.2.0-alpha002",
"kind": "other",
"published_at": "2022-01-19T14:17:19Z"
},
{
"tag": "release/0.2.0-alpha001",
"kind": "other",
"published_at": "2022-01-14T20:25:22Z"
},
{
"tag": "release/0.1.0-alpha009",
"kind": "other",
"published_at": "2021-10-27T16:37:34Z"
},
{
"tag": "release/0.1.0-alpha008",
"kind": "other",
"published_at": "2021-10-27T14:22:12Z"
},
{
"tag": "release/0.1.0-alpha007",
"kind": "other",
"published_at": "2021-03-22T18:20:00Z"
},
{
"tag": "0.1.0-alpha007",
"kind": "prerelease",
"published_at": "2021-02-28T23:11:40Z"
},
{
"tag": "0.1.0-alpha006",
"kind": "prerelease",
"published_at": "2020-12-09T20:02:30Z"
},
{
"tag": "release/0.1.0-alpha005",
"kind": "other",
"published_at": "2020-12-08T20:53:13Z"
},
{
"tag": "release/0.1.0-alpha003",
"kind": "other",
"published_at": "2020-08-25T20:58:42Z"
},
{
"tag": "release/0.1.0-alpha002",
"kind": "other",
"published_at": "2020-08-24T02:11:29Z"
},
{
"tag": "release/0.1.0-alpha001",
"kind": "other",
"published_at": "2020-08-24T01:48:11Z"
}
],
"recent_commits": [
{
"oid": "101897b84dbaa2537f40bb6099a9fbe60d73165e",
"body": "Motivation\n----------\nSecurity and modernization.\n\nModifications\n-------------\n- Use OIDC for NuGet push\n- Upgrade GitHub Actions versions\n- Include `Major.Minor` version tag on Docker\n- Include `alpha` NuGet package tags in package cleanup since we changed\nversion numbering for PRs recently\n- Include NodaTime packages in cleanup",
"is_bot": false,
"headline": "Use NuGet OIDC and other GHA improvements (#337)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-07-30T13:12:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "597607d588b1e12e92dc8e611be948fcffd9fe11",
"body": "Motivation\n------------\nEnable easier experimentation with preview language versions.\n\nModifications\n---------------\n- Make LangVersion a settable property on GenerationContext\n- Supply CSharpParseOptions from GenerationContext using that language\nversion on preprocessor directives\n- Reuse the CShar\n[…]\nations that were building their\nown parse options, as well as several spots that were using the default\nparse options\n- Provide a spot in nuget.config to configure NuGet to use the preview\nC# SDK feed",
"is_bot": false,
"headline": "Make C# LangVersion centrally configured (#336)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-07-27T13:59:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e80d6592bc0f07648358c7eaadc9da3bb9c77b97",
"body": "Motivation\n----------\nVarious extensions, including Yardarm.NodaTime, need to register simple\ncustom converters for nullable value types that wrap an inner converter\nand handle nulls. To prevent code duplication, make this a common\ninternal member available with the Yardarm.SystemTextJson extension.\n[…]\nto NullableConverter in the STJ client\n- Add references and InternalsVisibleTo to support testing\n\n---------\n\nCo-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>",
"is_bot": false,
"headline": "Make a common NullableConverter<T> for System.Text.Json (#334)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-07-10T14:17:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bd6fdd74498ad63866940ab6b59df3f6bd213336",
"body": "Motivation\n----------\nChanges to the Yardarm extension should trigger an compilation in\nincremental build scenarios. This supports dynamically built extensions.\n\nModifications\n-------------\nAdd the list of YardarmExtension files to the inputs of the CoreCompile\nstep. Also include the list of extensions in the core compile input\ncache so that a change in the list triggers a rebuild as well.",
"is_bot": false,
"headline": "Include Yardarm extensions as build inputs (#332)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-07-09T13:42:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "14d95e63c3e63c7ee09dd45f7851d811581f5481",
"body": "Motivation\n----------\nAllow other extensions to reference the NodaTime enricher so they may\nensure they run before or after.\n\nModifications\n-------------\nMake the class public and rename it to a name less likely to collide or\nconfuse consumers.",
"is_bot": false,
"headline": "Make NodaTime JsonSourceGenerationOptionsEnricher public (#333)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-07-09T13:42:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e68c293df35cc126bf827dc8acb0c4d4859b4340",
"body": "Motivation\r\n----------\r\nCurrently System.Text.Json serialization and deserialization may be customized by passing a JsonSerializerOptions instance. However, it's necessary to build this from scratch. There's no easy way for the SDK consumer to extend the default settings generated by the SDK.\r\n\r\nMod\n[…]\no JsonTypeSerializer that creates the default serializer and accepts an optional callback to further customize the options.\r\n- Use the new method when registered on the default TypeSerializerRegistry.",
"is_bot": false,
"headline": "Allow customization of JSON serialization/deserialization (#331)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-07-07T15:30:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "25bf703115712f34daf547b042c03afc85568444",
"body": "Motivation\n----------\nCode scanning flagged `build.yml` for missing explicit `GITHUB_TOKEN` permissions. This change makes permissions explicit and scopes them to each job with least privilege.\n\nModifications\n-------------\n- Removed the workflow-level permissions block and added per-job `permissions\n[…]\nworkflow commands and step summary output rather than commit status API updates.\n\nResults\n-------\n- `build.yml` now declares explicit permissions and aligns permissions to each job's responsibilities.",
"is_bot": false,
"headline": "Add explicit permissions to build workflow (#330)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-06-30T20:37:36Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "72c004f12d4835c0ecd4595a6d7799b5c84c8480",
"body": "Motivation\r\n----------\r\nWith modern NuGet restore via the SDK, the Microsoft.NETCore.App.Ref package is not installed because it's assumed to be included with the SDK. This is causing SDK-style builds to fail to load source generators included in the .NET SDK, including System.Text.Json generators, \n[…]\nbuilds now rely on the list of analyzers produced by the .NET SDK rather than our internal attempt to build a list. Source generators are part of analyzers, so we therefore get the correct generators.",
"is_bot": false,
"headline": "Get source generators from MSBuild for SDK-style builds (#329)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-06-30T17:32:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "49f04fdc25f93bf5cdcc797a945e861b929e97db",
"body": "Motivation\r\n----------\r\nThe default command-line behavior to suppress CS1701 and CS1702 is currently only applied if the NoWarn property in MSBuild is blank. If non-blank, the default suppressions are excluded. This results in unnecessary warnings for certain target frameworks and extensions.\r\n\r\nModifications\r\n-------------\r\nAlways include these suppressions in MSBuild when executing the YardarmGenerate task.",
"is_bot": false,
"headline": "Always suppress CS1701 and CS1702 for SDK-style builds (#328)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-06-29T20:47:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fe7032e5ec26f9187334a7a96aaf53fad94801e1",
"body": "GitVersion isn't working correctly for pre-releases and is frankly overkill. Also enable provenance on the Docker image build.",
"is_bot": false,
"headline": "Use CenterEdge action for release versioning (#327)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-06-26T13:13:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a3aef1e0c0ccbdce952e57750f41ba749197b894",
"body": "Motivation\r\n----------\r\nEnsure clients have any bug fixes.\r\n\r\nModifications\r\n-------------\r\nUpdate all client packages to their latest patch version, but not the latest major version. The major version is left unchanged to increase compatibility with clients targeting downlevel runtimes, we only increase major versions with new features are required or versions are deprecated.\r\n\r\nNodaTime serialization was bumped by a minor version to get some new features.",
"is_bot": false,
"headline": "Update client packages to latest patch versions (#326)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-06-26T12:31:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3bf4f39a0d9fc92eec76bd290229ba61e166d9f7",
"body": "Motivation\r\n----------\r\nCleanup versions prior to the 0.7 release.\r\n\r\nModifications\r\n-------------\r\n- Update all internal use packages to the latest\r\n- Organize client packages into a separate section for clarity",
"is_bot": false,
"headline": "Cleanup NuGet package references (#325)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-06-26T12:24:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f6558b7773168380d7d1729179ea870a864b140c",
"body": "Motivation\r\n----------\r\nGeneral modernization.\r\n\r\nModifications\r\n-------------\r\nUpgrade the packages and fix a compiler warning.",
"is_bot": false,
"headline": "Upgrade to Roslyn 5.3.0 packages (#324)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-06-26T12:01:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b9051619a643e428e275d885f971fccb4f0a5fa3",
"body": "Motivation\r\n----------\r\nUse latest MTP standards for running tests.\r\n\r\nModifications\r\n-------------\r\n- Update to xUnit with MTP v2\r\n- Update to latest GitHubActionsTestLogger\r\n- Drop legacy packages and use MTP v2 runner for CI\r\n- Remove CopyOnWrite, this is built into modern MSBuild\r\n- Also update GitHub Actions versions",
"is_bot": false,
"headline": "Modernize unit test packages and use MTP v2 (#323)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-06-25T21:32:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab38c2886fdd3e41cf892c1725115c5f6ed4b8ac",
"body": "Motivation\r\n----------\r\nResolve a security vulnerability in NuGet 7.0.1.\r\n\r\nModifications\r\n-------------\r\n- Upgrade the package version\r\n- Remove handling of top-level package dependencies, they are no longer present and are only found in target framework dependencies now\r\n- Ensure package restore fills the new TargetAlias on dependencies",
"is_bot": false,
"headline": "Upgrade to NuGet 7.6 (#322)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-06-25T21:14:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "82ff5fe7646f75d4227b7799ea89c3bda2833d49",
"body": "Motivation\r\n----------\r\nOpenAPI 3.1 follows RFC3339 for date/time formats, which is based on ISO8601 but doesn't allow excluding minutes from the time zone offset such as `-04` instead of `-04:00`. The default NodaTime serializers for System.Text.Json do this for OffsetDateTime, but not for OffsetTi\n[…]\nns\r\n-------------\r\nAdd an intermediate JsonConvertFactory that returns a converter with an RFC3339 format string for OffsetTime. It forwards to the default implementation for all other NodaTime types.",
"is_bot": false,
"headline": "Use RFC3339 for NodaTime OffsetTime serialization (#321)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-06-25T14:58:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "72a917edf275d074faa1817d46de90913aa31e5d",
"body": "Motivation\r\n----------\r\nThis allows additional information to be applied to the outgoing HttpRequestMessage which can then be used by HttpMessageHandlers in the outgoing request pipeline to change request behaviors.\r\n\r\nModifications\r\n-------------\r\nAdd the options to IOperationRequest and OperationRequest when targeting .NET 5 or later. .NET 5 is required for HttpRequestOptions.",
"is_bot": false,
"headline": "Allow consumers to apply HttpRequestOptions (#319)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2026-02-17T13:50:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1d9a486dbb53241e60b82282cdcd6bc14f40b9fb",
"body": null,
"is_bot": false,
"headline": "Add support for LocalDateTime to the NodaTime extension (#317)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-12-04T13:33:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "435d86b2ab9ea5662ef075d89515e867dca3115d",
"body": "Motivation\r\n----------\r\nFunctionality previously found in System.Linq.Async is now in-box in .NET 10 in a (mostly) compatible form. We can use it while targeting .NET 8 via the new System.Linq.AsyncEnumerable package.\r\n\r\nModifications\r\n-------------\r\n- Switch the package references\r\n- Fix a couple of method names that are different",
"is_bot": false,
"headline": "Switch to System.Linq.AsyncEnumerable (#315)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-12-02T13:42:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "92cac53bd2ef82a3ef0ecfdb26b0831614ccb0a2",
"body": "Motivation\r\n----------\r\nGeneral modernization.\r\n\r\nModifications\r\n-------------\r\n- Upgrade the package version\r\n- Move framework reference management to DefualtPackageSpecGenerator\r\n- Rewrite DependencyPackageSpecEnricher to work with immutable arrays of dependencies",
"is_bot": false,
"headline": "Upgrade to NuGet v7 (#314)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-12-01T21:58:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3da86f27e43973586a8ab72be5dd6572dac04df7",
"body": "* Convert to modern SLNX solution files\n\n* workflow",
"is_bot": false,
"headline": "Convert to modern SLNX solution files (#313)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-26T18:23:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ec36cac7aec8e24516550acd1b4312c151b5fb32",
"body": null,
"is_bot": false,
"headline": "Update to Roslyn v5 GA (#312)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-24T18:03:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "68af74ce2ef73893b1409d8d60829825bea54b32",
"body": "Motivation\r\n----------\r\nAllow consumers to more easily tune built-in settings in their SDK-style Yardarm projects.\r\n\r\nModifications\r\n-------------\r\n- UnknownDiscriminatorHandling to allow more relaxed handling in STJ of unkonwn discrimintators\r\n- DateTimeMode to control LegacyDateTimeHandling or NodaTime\r\n- DefaultHttpVersion and DefaultHttpVersionPolicy",
"is_bot": false,
"headline": "Add properties to SDK-style builds for recently added features (#311)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-24T16:16:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2908ef5429c529408231297007b8b93f402d2041",
"body": "* Apply misc package dependency updates\n\n* match in the test SDK",
"is_bot": false,
"headline": "Apply misc package dependency updates (#298)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-24T14:12:26Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d8a918ee30ba18b76b5a9e01afdbe1b3819afa6e",
"body": "Motivation\r\n----------\r\nSome APIs may have more flexible response types that cause deserialization errors as new discriminator values are added.\r\n\r\nModifications\r\n-------------\r\nAdd a new property which may be passed with a value of `UnknownDiscrimiatorHandling=ReturnNull` to opt out of JsonException and instead return null when an unknown or missing discriminator is encountered.",
"is_bot": false,
"headline": "Add an option to relax discriminator rules (#307)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-24T14:12:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e93077856e5ab64c9e8791952cb5b3a4af03a05c",
"body": "Motivation\r\n----------\r\nBy default, .NET will only use HTTP/1.1. If an API supports HTTP/2.0 or 3.0 we need an easy way for the generated SDK to enable this support on compatible runtimes.\r\n\r\nModifications\r\n-------------\r\nAccept two new parameters, `DefaultHttpVersion` and `DefaultHttpVersionPolicy`, which set these values. The second is ignored on downlevel runtimes. If not set, they will default to the values used by default in HttpRequestMessage for the target runtime.\r\n\r\nFixes #300",
"is_bot": false,
"headline": "Allow setting the HTTP version (#310)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-23T22:05:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e078364337db90a3907c78105b9c2f42940c6fb7",
"body": "Motivation\r\n----------\r\nSome SDKs may want to provide additional functionality or helpers, beyond what's specified in the OpenAPI spec, to make it easier for C# consumers to use the SDK.\r\n\r\nModifications\r\n-------------\r\n- Add a command line parameter to allow including files in the compilation. These files are embedded in PDBs but do not get reformatted.\r\n- Include .cs files in SDK-style projects automatically using the `Compile` item type just like a regular C# project.",
"is_bot": false,
"headline": "Allow additional C# files to be included in the SDK (#309)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-23T22:04:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fea466e91afcee24a4e3c5989fe95c31cc4c85fe",
"body": "This aligns with the RFC3339 spec which is referenced for the well known \"duration\" format per the OpenAPI format registry.",
"is_bot": false,
"headline": "Use NodaTime.Period for \"duration\" format string schemas (#308)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-23T18:37:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d67b548499fed9fa624e83212e5fb8b9af1682d5",
"body": null,
"is_bot": false,
"headline": "Use C# 14 features in STJ extensions (#306)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-21T15:22:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "96d3856b2daafcc3b5146feee8c001d667de3e39",
"body": "* Use C# 14 language features in NodaTime extensions\n\n* missed a spot",
"is_bot": false,
"headline": "Use C# 14 language features in NodaTime extensions (#305)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-17T13:10:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "54cda12888d95d10eef850e106d5afd2e62873e5",
"body": "Motivation\r\n----------\r\n.NET 10 is recently released and should be targetable.\r\n\r\nModifications\r\n-------------\r\n- Add .NET 10 to test projects\r\n- Adjust package version tests on some dependency generators\r\n- Add .NET 10 preprocessor directive support\r\n- Include .NET 10 running integration tests",
"is_bot": false,
"headline": "Add support for targeting .NET 10 (#303)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-16T16:27:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "12abd6d9cadfc9c21f58b081497c734a6defb255",
"body": null,
"is_bot": false,
"headline": "Use C# 14 language features in HTTP extensions (#304)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-16T16:26:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b61886c5f41389099c74197936764033d662d6d",
"body": "Motivation\r\n----------\r\nGeneral modernization.\r\n\r\nModifications\r\n-------------\r\n- Use file-scoped namespaces\r\n- Use primary constructors where applicable\r\n- Use collection expressions\r\n- Use target-typed new expressions\r\n- Use the field keyword where applicable\r\n- Switch ThrowHelper.ThrowIfNull to a static extension that polyfills ArgumentNullException.ThrowIfNull\r\n- Use C# 14 extension blocks for ITypeSerializerRegistry extensions",
"is_bot": false,
"headline": "Use C# 14 features in Yardarm.Client (#302)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-10T14:07:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "655eae2fc6dfd1875c9ba9ac2d3d21dbdad8b036",
"body": "Motivation\r\n----------\r\nAllow the use of C# 13 and 14 language features within the code for generated client SDKs.\r\n\r\nModifications\r\n-------------\r\n- Upgrade the C# libraries\r\n- Change the language version of C# files loaded from resources",
"is_bot": false,
"headline": "Use C# 14 for generated SDK client compilation (#301)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-11-09T19:51:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "be22b33ad84b05001128370150b3b9751c7a456d",
"body": "Motivation\r\n----------\r\nImprove code clarity and access to features like extension properties.\r\n\r\nModifications\r\n-------------\r\n- Refactor all current extensions in the non-client layer\r\n- Leave client alone for now since we're still using C# 12 when building SDKs\r\n- Update GitVersion and GitHub Actions",
"is_bot": false,
"headline": "Refactor extension methods to the latest C# 14 syntax (#299)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-10-14T18:07:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4dce857e1f8e098a96fbecb80d3fc409e8e4ad04",
"body": null,
"is_bot": false,
"headline": "Pass properties to Yardarm via the SDK (#297)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-07-08T16:38:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a0ccdfddbe0ae02385c96cf6bc6ac75d26fafc0e",
"body": "Fixes #295",
"is_bot": false,
"headline": "Collect correct command line files for the SDK (#296)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-07-08T15:48:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "61881c82bd59311ae14500941cfdc505415d2d2a",
"body": null,
"is_bot": false,
"headline": "Don't package client projects (#294)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-04-09T17:41:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1924bcb6d5317074335f9fe0220580ef65c469a5",
"body": "Fixes regression in a77e7161c18ffdf7816cf2fb0e9f044a9f5ce3d3",
"is_bot": false,
"headline": "Exclude leading slash from paths with no parameters (#293)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-04-09T17:14:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a77e7161c18ffdf7816cf2fb0e9f044a9f5ce3d3",
"body": "This avoids a `stackalloc` and unnecessary string interpolation.",
"is_bot": false,
"headline": "Use simple string for URIs with no variable segments (#292)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-04-04T15:51:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fe6c265eb4165bcfa36033b0a5e4b20710ba74dd",
"body": "Motivation\r\n----------\r\nProvide more centralized logic with less repitition and make request building more extensible in the future. Also allow access to the `ITypeSerializerRegistry` when building headers and URIs.\r\n\r\nModifications\r\n-------------\r\n- Add virtual or abstract methods to `OperationRequ\n[…]\nconsumers inheriting from request classes to override these methods. However, this should be a one-time breaking change, in the future we can add additional required parameters to BuildRequestContext.",
"is_bot": false,
"headline": "Implement BuildRequest on OperationRequest abstract class (#291)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-04-04T15:29:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "39c52f94a6693053883da4582456b3c50042a301",
"body": "Motivation\r\n------------\r\nIn many domains, it is common to use the more expressive NodaTime types, such as `OffsetDateTime`, `LocalDate`, `LocalTime`, etc to represent dates and times rather than `System.DateTime` and `System.DateTimeOffset`. Exposing these from a generated SDK can reduce the need f\n[…]\nTime`\r\n- Create literal converters for query strings, etc, for the in-use NodaTime types\r\n- Wireup JSON converters for either System.Text.Json or Newtonsoft.Json based on which extension is registered",
"is_bot": false,
"headline": "Add new extension to use NodaTime types for dates and times (#290)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-03-24T20:41:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5ceca8659f7fc85d5cda1fcb3816d6af6492b737",
"body": null,
"is_bot": false,
"headline": "Publish Docker image as ReadyToRun (#289)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-03-21T12:44:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "93bc397e111ed2814ddab66fd8b51ff71019eab1",
"body": "Motivation\r\n----------\r\nMake it easier for extensions to control type generation. In particular, allow an extension to override the default type generation without requiring modification after code generation using an enricher.\r\n\r\nModifications\r\n-------------\r\n- Allow more than one ITypeGeneratorFac\n[…]\n\r\n\r\n```diff\r\n- public MyConsumer(ITypeGeneratorRegistry<OpenApiSchema, MyCategory> registry)\r\n+ public MyConsumer([FromKeyedServices(\"MyCategory\")] ITypeGeneratorRegistry<OpenApiSchema> registry)\r\n```",
"is_bot": false,
"headline": "Improve extensibility of type generators (#288)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-02-24T12:41:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "fa3ae2ca312dcd868b673d69dae50093c99d98c4",
"body": null,
"is_bot": false,
"headline": "Correct nullable annotations on LiteralConverter.Read (#287)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-02-10T13:08:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ccdbc1def976fc43d085915b602daafa44974dd8",
"body": "This allows additional extensions to extend the default Newtonsoft.Json JsonSerializerSettings or the System.Text.Json\r\nJsonSourceGenerationOptions attribute in order to customize JSON serialization/deserialization behaviors. In particular, this can be used to register additional JSON converters.",
"is_bot": false,
"headline": "Enable extending JSON serialization settings (#286)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-02-09T23:12:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b45d4421d7deb353118877f72d2cab7adaa621c6",
"body": "This will allow us to add other types of extension registration, such as JSON converters, more easily.",
"is_bot": false,
"headline": "Create a more generic form for registration enrichers (#285)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-02-09T15:31:06Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "226d4d2354bc6396b1ada24b9d929c56aaaeaa75",
"body": "Motivation\r\n----------\r\nFor \"date\", \"partial-date\", and \"partial-time\" string formats, DateOnly and TimeOnly are a better fit when available in .NET 6 or later.\r\n\r\nModifications\r\n-------------\r\n- Add a dependency on Microsoft.Extensions.Options\r\n- Create a new internal option to control date/time ha\n[…]\nse backward compatibility issues in generated SDKs. Use the command line switch `-p LegacyDateTimeHandling=true` to restore the previous behavior. This is not necessary if targeting .NET Standard 2.0.",
"is_bot": false,
"headline": "Add support for DateOnly and TimeOnly (#284)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-02-01T22:38:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8b7fc50cc0780adc96d200aa757342dbba36fe39",
"body": "… (#283)\n\nMotivation\r\n----------\r\nWe want to support backward compat switches and other customizations, but they'll need to work for extensions as well so it should be flexible.\r\n\r\nModifications\r\n-------------\r\nAdd name/value pair properties which can be passed on the command line, similar to MSBuild.",
"is_bot": false,
"headline": "Add a framework for flexible options to be passed on the command line…",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-02-01T17:45:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7c418a40f942806d45efcbae572458aba933fb14",
"body": "Motivation\r\n----------\r\nWe'd like to add support for DateOnly and TimeOnly when targeting modern .NET and using System.Text.Json. When we do, we'll need support for header and query string literals as well.\r\n\r\nModifications\r\n-------------\r\n- Add DateOnlyLiteralConverter and TimeOnlyLiteralConverter,\n[…]\nn formats used by System.Text.Json\r\n- Register on LiteralConverterRegistry\r\n\r\nResults\r\n-------\r\nNo changes for now unless an extension is used to change schema generation to use DateOnly and TimeOnly.",
"is_bot": false,
"headline": "Add DateOnly and TimeOnly literal converters (#282)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-02-01T17:33:26Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8380f19d720143828e5f4409d5ea2808b7204a64",
"body": "Motivation\r\n----------\r\nThe current filtering approach is limited to only .NET Standard vs .NET Core and modern .NET. There are reasons to also allow filtering based on specific .NET versions.\r\n\r\nModifications\r\n-------------\r\n- Move a lot of duplicate logic in the .Client projects to the Directory.Build.targets file.\r\n- Allow `.netX.Y.cs` suffixes on resource files in the .Client projects to limit the target versions they apply to.",
"is_bot": false,
"headline": "Support C# resource filtering by .NET version (#281)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-02-01T17:14:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "65f3dbdfb48213747366f1c984c4ac546c8389e2",
"body": null,
"is_bot": false,
"headline": "Add StackTraceHidden to the ThrowIfNull helper on .NET >= 6 (#280)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2025-01-08T13:22:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eccdd0160e2510753352fdaeee7d9bfc427959d5",
"body": "Relates to #277",
"is_bot": false,
"headline": "Always explicitly reference STJ if the extension is used (#279)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-12-13T18:28:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a0f455601812c8ee48a8c9a24571528d4ffa8948",
"body": "Motivation\r\n----------\r\nThis dependency is unnecesary and causing security warnings on the transitive System.Private.Uri dependency.\r\n\r\nModifications\r\n-------------\r\nRemove the dependency.",
"is_bot": false,
"headline": "Remove System.Net.Primitives dependency (#276)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-11-29T17:08:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8e305dfd5120a5922e79403093acf3e51a792450",
"body": "Motivation\r\n----------\r\nIt's possible for a system running a build to have only the .NET 9 SDK installed, without the .NET 8 runtime. In this case, setting environment variables to force a roll forward to .NET 9 is required.\r\n\r\nModifications\r\n-------------\r\nSet the roll forward configuration to Majo\n[…]\nSDK-style builds will now automatically roll forward to the .NET 9 runtime to run Yardarm if the .NET 8 runtime is unavailable. For best compatibility, the .NET 8 runtime is still prefered if present.",
"is_bot": false,
"headline": "Allow the command line app to roll forward to .NET 9 runtime (#275)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-11-29T16:17:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "30cb61ebf6855ecfe592530aa5cfca696c5894b4",
"body": null,
"is_bot": false,
"headline": "Add support for targeting .NET 9 (#274)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-11-29T16:00:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ad35c08e6959148e2207d366022ca3defc8da2ec",
"body": "Motivation\r\n----------\r\nSecurity vulnerabilities in transitive dependencies and general modernization.\r\n\r\nModifications\r\n-------------\r\n- Update NuGet.Commands due to transitive security vulnerabilities\r\n- Resolve obsoletion of RestoreCommandProvider.Create\r\n- Update unit test dependencies\r\n- Update System.Threading.Tasks.Extensions to align SourceLink with the new repository (supposedly has no code changes)",
"is_bot": false,
"headline": "Update various NuGet dependencies (#273)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-11-29T15:28:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e8ab413c5ff041ce70600b7954670eca115ece8a",
"body": "Motivation\r\n----------\r\nSystem.Text.Json 9 adds the new JsonStringEnumMemberNameAttribute to override string names for enum members. Using this makes more sense than our custom implementation.\r\n\r\nModifications\r\n-------------\r\n- Upgrade to System.Text.Json 9.0.0\r\n- Drop our custom internal implementation\r\n- Switch to using the default JsonStringEnumConverter\r\n- Copy the EnumMember string to the JsonStringEnumMemberName attribute",
"is_bot": false,
"headline": "Use JsonStringEnumMemberNameAttribute for STJ enums (#272)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-11-29T14:19:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ead605ccdc7417c80c4cafa88325169f67d68940",
"body": "Overload the Add method for value vs reference types rather than requiring different method names.",
"is_bot": false,
"headline": "Simplify literal conversion registration (#271)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-11-02T13:52:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "71703006d55d61403f21d89d04a7f9d7e1fe3e7a",
"body": "This will make it much easier for extensions to register their literal converters.\r\n\r\nAlso, refactor `DefaultTypeSerializerEnricher` to implement `IResourceFileEnricher` executed by the\r\n`ResourceFileCompilationEnricher`.",
"is_bot": false,
"headline": "Create system to register LiteralConverters (#270)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-11-02T13:29:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f18e7444e55b68f074f5c71d330ddaadab11d861",
"body": "Motivation\r\n----------\r\nExtensions may need to control serialization and deserialization of literals beyond the types including in-box.\r\n\r\nModifications\r\n-------------\r\n- Define `LiteralConverter` and `LiteralConverter<T>` abstract base types for converters\r\n- Create `LiteralConverterRegistry` for r\n[…]\n need to customize serialization may also do so by mutating the public `LiteralConverterRegistry.Instance`.\r\n\r\nAlso fixes a bug deserializing nullable enums from literals.\r\n\r\nResolves #268\r\nFixes #267",
"is_bot": false,
"headline": "Create system for registering custom LiteralConverters (#269)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-30T20:15:33Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "81b3c2f3c865e9a282a8b7ab3f7ec10ae6127e47",
"body": "Motivation\r\n----------\r\nImproved performance and reduced heap allocations building URLs for requests. While parts of this could be backported to downlevel frameworks, it's generally not worth the effort, so it only applies to .NET 6 and newer.\r\n\r\nModifications\r\n-------------\r\n- Add `TrySerialize` to\n[…]\n--:|------------:|\r\n| Serialize | 28.92 ns | 0.176 ns | 0.156 ns | 1.00 | 0.0216 | 272 B | 1.00 |\r\n| Build | 24.10 ns | 0.153 ns | 0.136 ns | 0.83 | 0.0108 | 136 B | 0.50 |",
"is_bot": false,
"headline": "Use a custom interpolation handler for paths (#266)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-21T21:01:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "cb04589e4ef61a819358d77984104ab22525d2c2",
"body": "- No longer boxes when serializing some value types such as int, long, and Guid\r\n- Don't unnecessarily load CultureInfo.InvariantCulture for Guid\r\n- Use \".\" separator for PathSegmentStyle.Label regardless of the value of \"explode\" (this correctly follows the specification)\r\n\r\n**Breaking changes\r\n- LiteralSerializer and HeaderSerializer are now static classes",
"is_bot": false,
"headline": "Performance improvents to LiteralSerializer (#265)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-20T15:59:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a000c31429543bf29dbc5362c132f70dbe231c50",
"body": "* Use artifacts output path for build output\n\n* fix tests",
"is_bot": false,
"headline": "Use artifacts output path for build output (#264)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-13T16:30:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b3636be923b76b82602da09855da9086fa082a05",
"body": null,
"is_bot": false,
"headline": "Use central package version control (#263)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-13T15:34:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2108f73df01d0ebd5daa2f378b8a279498fedf82",
"body": null,
"is_bot": false,
"headline": "Add additional timing logs (#262)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-13T15:22:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ea28418a46597af1939a32f6bd3f24702466f26",
"body": "Motivation\r\n----------\r\nJIT of the C# compiler is very expensive when running and the cost can be significantly reduced by publishing the command line app ReadyToRun.\r\n\r\nModifications\r\n-------------\r\n- Set PublishReadyToRun on Yardarm.CommandLine\r\n- Update Dockerfile to publish the app rather than i\n[…]\nnd the SDK so that the SDK variant may be built on Windows where all target runtime identifers are supported for ReadyToRun\r\n- Update the Docker build to build both x64 and arm64 variants of the image",
"is_bot": false,
"headline": "Use ReadyToRun to improve performance (#261)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-12T18:04:11Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d27eabbccc28f4cc12ae09996b341a4948237791",
"body": "Useful when uploading to NuGet servers that don't support snupkg such as GitHub Packages.",
"is_bot": false,
"headline": "Allow embedding symbols in the nupkg file (#260)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-12T13:39:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6824b74c12d4ad9ca7a30f2aa190eef3f034822b",
"body": "Motivation\r\n----------\r\nCurrently it's difficult to use custom JSON options because the consumer msut register all of the serializers and some of the methods aren't even available publicly.\r\n\r\nModifications\r\n-------------\r\n- Add CreateBasicRegistry which provides a baseline registry that can be easily extended with custom JSON options\r\n- Improve formatting of generated source in CreateDefaultRegistry\r\n- Short-circuit for perf when enriching CreateDefaultRegistry",
"is_bot": false,
"headline": "Make registering with custom JSON options easier (#259)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-11T20:27:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5790aa2b04dbf018704c7ef1238d493c53eb1904",
"body": "- Add overload to AddApi<TClient, TImplementation> that accepts a name to match AddApi<TClient>\r\n- For default registration via AddAllApis or AddAllOtherApis use the full type name with namespace rather than just the interface name\r\n\r\nFixes #247",
"is_bot": false,
"headline": "Improve DI registration of named http clients (#258)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-11T19:42:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9af41bdc3ae34ae3db2a305f1afe4ac2b3f66c1d",
"body": "- Upgrade unit test packages and move their definition to Directory.Build.targets\r\n- Include GitHubActionsTestLogger\r\n- Upgrade CSharp, NuGet, OpenAPI, MS.Ext.Http, etc",
"is_bot": false,
"headline": "Upgrade various packages and apply some modernizations (#257)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-11T18:39:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7fb7842a6c98b18d00501e7329e61b007bf536cd",
"body": "https://github.com/advisories/GHSA-8g4q-xg66-9fp4",
"is_bot": false,
"headline": "Update System.Text.Json to 8.0.5 (#255)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-10-11T18:13:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2309bd33da6da5dc5bf896732118ef2a92f5fb0b",
"body": "Motivation\r\n----------\r\nThe current approach of a string replace incurs some additional allocation overhead.\r\n\r\nModifications\r\n-------------\r\nProcess the string replacement as UTF8 against the raw bytes of the manifest resource stream rather than deserializing to a string and then generating another string with the namespace replaced.",
"is_bot": false,
"headline": "Load and parse embedded resources more efficiently (#254)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-09-21T22:10:57Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "be9772121e35a57fc9fcb932360a790d1b7b8041",
"body": "Motivation\r\n----------\r\nSince we are highly parallelized and doing a lot of SyntaxNode heap allocations, for multicore machines we can get fewer GC pauses by using server GC. This is a good default for this project.\r\n\r\nModifications\r\n-------------\r\nEnable Server GC for the Yardarm command line. Note that a single core machine will ignore this setting and use Workstation GC.",
"is_bot": false,
"headline": "Enable Server GC (#253)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-09-21T21:25:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37a6ea518600c54ec6fce0cd1ffdd5fa25f58ee0",
"body": "Motivation\r\n----------\r\nOn multi-core machines this can provide a notable, though not huge, performance gain. On my machine it was cutting the time on a large SDK from 1 second to half a second.\r\n\r\nModifications\r\n-------------\r\nUse Parallel.ForEachAsync instead of an IAsyncEnumerable.",
"is_bot": false,
"headline": "Parallelize collection of embedded text (#252)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-09-21T13:14:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cbf7d4657c100ca3af6ffd9103d908bf4ed79434",
"body": "Motivation\r\n----------\r\nSignificantly improves performance by using multiple cores for one of the major enrichment steps.\r\n\r\nModifications\r\n-------------\r\nLoop through the syntax trees for each enricher in parallel, and perform a single operation to mutate the CSharpCompilation after each enricher is complete.",
"is_bot": false,
"headline": "Run OpenApiSyntaxNodeEnrichers in parallel (#251)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-09-21T12:55:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "db284a66389c24b5d94a819f306e74db510d750c",
"body": "Motivation\r\n----------\r\nCurrently formatting for embedding hits a lock of lock contention and has some heap allocations on replace that can be avoided.\r\n\r\nModifications\r\n-------------\r\nDon't lock on the parallel process and perform fewer mutations on the overall C# compilation by batching them at the end.",
"is_bot": false,
"headline": "Improve perf of formatting for embedding (#250)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-09-20T20:38:22Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2a21d89ac4c0bce46aebd50d7c8687da6fce4b28",
"body": "This ensures that all variants of JsonNode may be serialized, such as JsonArray and JsonValue, not just JsonObject.\r\n\r\nFixes #248",
"is_bot": false,
"headline": "Register JsonNode on JsonSerializerContext, not JsonObject (#249)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-09-19T13:21:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4f58807d8c766f754df3d2df650007d66ecec8ab",
"body": "Currently, properties are only generated for parameters listed explicitly on each operation (except for simple `string` properties for route parameters). The OpenAPI spec allows for parameters to be defined at the path level and then overridden for each operation.\r\n\r\nThis implements that behavior, handling query and header parameters defined at the path level and using the correct schema for route parameters defined at the path level.\r\n\r\nRelates to #239",
"is_bot": false,
"headline": "Generate properties for parameters included on path items (#246)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-07-19T20:59:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a975761c2bd6a263d145764c64c11ae95c510497",
"body": "Relates to #239",
"is_bot": false,
"headline": "Add support for query string based API keys (#245)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-07-19T20:00:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "84ae632e1ffefbf65997adb99586440efddc89c6",
"body": "There is a known security vulnerability in 8.0.3",
"is_bot": false,
"headline": "Update to System.Text.Json 8.0.4 (#244)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-07-19T18:39:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1143f6bdece72956d68e687bc0127368b0a1ed5b",
"body": "The current code for parameter components fails because it can't generate a source file path for embedding. Also, it results in duplicate schema generation if there are references to schemas from the parameters and can have name conflicts between these schemas.\r\n\r\nInstead, generate parameter classes\n[…]\nchema needs to be generated and nest the schema inside that class. This also addresses the source file name problem since there is a type name to use as the basis for the file name.\r\n\r\nRelates to #239",
"is_bot": false,
"headline": "Generate correct code for parameter components (#243)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-07-19T18:17:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5468957f2c61fd91f8aaa1f80e10fc86e4ade69d",
"body": "Motivation\r\n----------\r\nWe can't generate methods or classes for operations without ids because we don't have a way to name them. We would, however, like to provide room for extensibility so consumers may provide their own operation naming scheme.\r\n\r\nModifications\r\n-------------\r\n- Add IOperationNam\n[…]\nempty\r\n- Update to Microsoft.Extensions 8.0 libraries\r\n- Use ActivatorUtilities object factories for easier DI in several places\r\n- Convert to primary constructors in several places\r\n\r\nRelates to #239",
"is_bot": false,
"headline": "Skip operations without ids (#242)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-07-19T16:14:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "17c7f6312bf704d79c87b1df566bc7a33ab583b1",
"body": "If request bodies are references to shared components we still need to treat them separately, rather than sharing a single instance across all operations that reference the request body. This allows the child media types to track up to their operation parent and generate a separate class for each operation/mediatype combination.\r\n\r\nRelates to #239",
"is_bot": false,
"headline": "Generate classes for common request bodies (#241)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-07-19T14:48:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4db8f135a435574c2fcd5a74ae982acd540f7074",
"body": "There may be route parameters in the path which are not explicitly\r\ndefined in the operation's parameters array. In this case, just assume\r\nthat it's a simple string parameter.",
"is_bot": false,
"headline": "Allow undefined route parameters (#240)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-07-19T14:02:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "23681d1e29e68e78a81a952245a7c5d10401e1ba",
"body": null,
"is_bot": false,
"headline": "Update GHA versions (#238)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-05-29T03:45:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4748c7b9f952a8544827ea9b0574aa1dadb6f22e",
"body": "* Correct capitalization on STJ enum values\n\n* Get C# 12 language features",
"is_bot": false,
"headline": "Correct capitalization on STJ enum values (#237)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-05-28T20:17:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "51b0fba85dd42fb984e3e2fda4ccacc08273e8c8",
"body": "It's relatively common for web JSON implementations to return numeric values as strings. So long as they're valid numbers, the SDK should accept them when deserializing.",
"is_bot": false,
"headline": "Allow deserializing numbers from strings in STJ (#236)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-05-28T14:30:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "50d877ccae467d7197f9d6958c3a6887e1827f5f",
"body": "Motivation\r\n----------\r\nThe current structure for additional properties on objects is difficult\r\nfor consumers to use. They must deal with type casting and the specific\r\ndynamic implementations of each serialization library (JElement or\r\nJsonElement, etc). For cases where the object is ONLY made up \n[…]\n will produce a\r\n breaking change in generated SDKs. However, this seems like a rare\r\n corner case and the value of supporting simple dictionaries seems to\r\n outweigh this concern.\r\n\r\nResolves #203",
"is_bot": false,
"headline": "Treat simple additional properties objects as dictionaries (#235)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-05-28T14:07:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "df0628fba0d6384ed498c40cee2d168161673669",
"body": null,
"is_bot": false,
"headline": "Upgrade to System.Text.Json 8.0.3 (#234)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-04-28T13:24:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ef17ee02421a4f4f2439707523a6b38ae4b6c7e3",
"body": "Motivation\r\n----------\r\nFor common types like numbers and strings we're allocating more YardarmTypeInfo objects on the heap than necessary. We'd also like to get more clarity when a given type requires dynamic serialization as this may require additional support by serialization libraries.\r\n\r\nModifi\n[…]\ncognize if the schema requires certain types of serialization support based on where it's located.\r\n- Add RequiresDynamicSerialization to YardarmTypeInfo and set to true for the DynamicSchemaGenerator",
"is_bot": false,
"headline": "Optimize schema type info for some common types (#233)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-04-28T03:09:42Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e42883bf1bcacae3a7a23dfdb3e7db6f411032ec",
"body": "Motivation\r\n----------\r\nFor List<T> types that appear in multiple schemas we're currently repeating the JsonSerializable attribute on ModelSerializerContext for each occurrence.\r\n\r\nModifications\r\n-------------\r\nRewrite to use a clearer approach to building the list of attributes which also uses a HashSet to prevent duplicates.",
"is_bot": false,
"headline": "Don't create duplicate JsonSerializable attributes (#232)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2024-04-27T21:48:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ac6c2dbc13d297cb768ce38f80dfe36426900807",
"body": "Motivation\r\n----------\r\nAllow SDK-style consumers to add additional warning suppressions as needed. In particular, upgraded NuGet packages may trigger new warnings such as NRT warnings.\r\n\r\nModifications\r\n-------------\r\nMove default warning suppressions to the command line arguments and pass the NoWarn property through on the command line. Also forward to NuGet restore for command-line restores.\r\n\r\nFixes #221",
"is_bot": false,
"headline": "Pass NoWarn through SDK builds to Yardarm (#228)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2023-11-18T21:37:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "784d2de8e6153a5573cc6b2e202398b1d99d8e88",
"body": "…7.x (#227)\n\nMotivation\r\n----------\r\nThe name parameter should be annotated as nullable to match the nullability annotations in Microsoft.Extensiosn.Http 7.x and greater to avoid warnings.\r\n\r\nModifications\r\n-------------\r\nFix the annotation.\r\n\r\nResults\r\n-------\r\nNo warnings with the default 6.x version or newer versions.",
"is_bot": false,
"headline": "Avoid NRT warnings if consumer upgrades to Microsoft.Extensions.Http …",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2023-11-18T18:35:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a7cff2103027685b1fb54f6f29a9a6ea29e94dde",
"body": "Motivation\r\n----------\r\nImproved performance and new features.\r\n\r\nModifications\r\n-------------\r\n- Upgrade all generator and unit test projects to target .NET 8\r\n- Bump to C# 12 for all projects\r\n- Upgrade various unit test dependencies\r\n- Remove NullableAttributes from Yardarm, they're all available OOB now\r\n- Fix some nullability warnings\r\n- Remove reference to Microsoft.SourceLink.GitHub, it's OOB now\r\n- Update SDK references\r\n- Update Dockerfile",
"is_bot": false,
"headline": "Upgrade generator to .NET 8 (#226)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2023-11-18T17:52:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8cf822b732ebadf3e2fb0e0bdbcb8a6e8610c974",
"body": "Motivation\r\n----------\r\nPackage source mapping doesn't always match sources by name.\r\n\r\nModifications\r\n-------------\r\nUpgrade the NuGet version and change the overload used to create sources. This also required upgrading Newtonsoft.Json.",
"is_bot": false,
"headline": "Fixup package source mapping (#224)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2023-11-18T16:22:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e95ed2d37ccf1b6e55a39f8db7552fdc1f06d39",
"body": null,
"is_bot": false,
"headline": "Use .NET SDK 8 for builds (#225)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2023-11-18T16:06:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "93563fe17996938b7ce7c21155bb6cb0d0a47284",
"body": null,
"is_bot": false,
"headline": "Upgrade to release bits of System.Text.Json 8.0 (#223)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2023-11-18T14:04:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3017f2d96b8caab3c9b7ee623f7436ee7d0c0434",
"body": "Motivation\r\n----------\r\nNow that we support streaming response bodies to the deserializer it's more likely that we could encounter a cancellation while deserializing. We should respect the request for cancellation where possible.\r\n\r\nModifications\r\n-------------\r\nAdd an overload of `DeserializeAsync`\n[…]\n without a secondary modern runtime such as .NET 6 included in the NuGet package. It is recommended that any SDK distribution that includes .NET Standard 2.0 also include .NET 6 assembly at a minimum.",
"is_bot": false,
"headline": "Add support for cancellation during deserialization (#220)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2023-11-06T13:08:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "57bbb82a489dc1fe0ef2dd561d4c4c9014caf8d2",
"body": "Motivation\r\n----------\r\nSwashbuckle commonly outputs TimeSpan types as `date-span` string formats in the output Swagger specifications.\r\n\r\nModifications\r\n-------------\r\nTreat `date-span` the same as `partial-time`.\r\n\r\nFixes #214",
"is_bot": false,
"headline": "Treat \"date-span\" string formats as System.TimeSpan (#219)",
"author_name": "Brant Burnett",
"author_login": "brantburnett",
"committed_at": "2023-10-30T18:06:05Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 54,
"commits_last_year": 34,
"latest_release_at": "2026-07-30T13:34:07Z",
"latest_release_tag": "release/0.7.0",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 11,
"days_since_latest_release": 0,
"mean_days_between_releases": 26.5
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 50,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": []
},
"popularity": {
"forks": 7,
"stars": 51,
"watchers": 4,
"fork_history": {
"days": [
{
"date": "2020-08-25",
"count": 1
},
{
"date": "2022-06-24",
"count": 1
},
{
"date": "2022-10-31",
"count": 1
},
{
"date": "2023-01-11",
"count": 1
},
{
"date": "2025-03-16",
"count": 1
},
{
"date": "2025-06-09",
"count": 1
},
{
"date": "2026-04-12",
"count": 1
}
],
"complete": true,
"collected": 7,
"total_forks": 7
},
"star_history": null,
"open_issues_and_prs": 7
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [
"src/main/Yardarm.CommandLine/swagger.json"
],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"src/main/Yardarm.Benchmarks/Yardarm.Benchmarks.csproj",
"src/main/Yardarm.Client.UnitTests/Yardarm.Client.UnitTests.csproj",
"src/main/Yardarm.Client/Yardarm.Client.csproj",
"src/main/Yardarm.CommandLine/Yardarm.CommandLine.csproj",
"src/main/Yardarm.MicrosoftExtensionsHttp.Client/Yardarm.MicrosoftExtensionsHttp.Client.csproj",
"src/main/Yardarm.MicrosoftExtensionsHttp/Yardarm.MicrosoftExtensionsHttp.csproj",
"src/main/Yardarm.NewtonsoftJson.Client/Yardarm.NewtonsoftJson.Client.csproj",
"src/main/Yardarm.NewtonsoftJson/Yardarm.NewtonsoftJson.csproj",
"src/main/Yardarm.NodaTime.Client/Yardarm.NodaTime.Client.csproj",
"src/main/Yardarm.NodaTime.UnitTests/Yardarm.NodaTime.UnitTests.csproj",
"src/main/Yardarm.NodaTime/Yardarm.NodaTime.csproj",
"src/main/Yardarm.SystemTextJson.Client/Yardarm.SystemTextJson.Client.csproj",
"src/main/Yardarm.SystemTextJson.UnitTests/Yardarm.SystemTextJson.UnitTests.csproj",
"src/main/Yardarm.SystemTextJson/Yardarm.SystemTextJson.csproj",
"src/main/Yardarm.UnitTests/Yardarm.UnitTests.csproj",
"src/main/Yardarm/Yardarm.csproj",
"src/sdk/Yardarm.Sdk.Test/Yardarm.Sdk.Test.csproj",
"src/sdk/Yardarm.Sdk/Yardarm.Sdk.csproj"
],
"largest_source_bytes": 26314,
"source_files_sampled": 418,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [],
"advisories": {
"error": "No resolved dependencies carried a version and a supported ecosystem",
"scope": "repository_graph",
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 22,
"direct_affected_count": 0
},
"ecosystems": [],
"dependencies": [],
"all_dependencies": {
"error": null,
"source": "github-sbom",
"packages": [
{
"name": "BenchmarkDotNet",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "CommandLineParser",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Microsoft.Build.Framework",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Microsoft.Build.Utilities.Core",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Microsoft.CodeAnalysis.CSharp",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Microsoft.CodeAnalysis.CSharp.Workspaces",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Microsoft.Extensions.DependencyInjection",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Microsoft.Extensions.Http",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Microsoft.Extensions.Logging",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Microsoft.Extensions.Options",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Microsoft.OpenApi",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Microsoft.OpenApi.Readers",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Newtonsoft.Json",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "NodaTime.Serialization.SystemTextJson",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "NuGet.Commands",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Serilog.Extensions.Logging",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "Serilog.Sinks.Console",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "System.Collections.Immutable",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "System.Linq.AsyncEnumerable",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "System.Net.Http.Json",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "System.Text.Json",
"direct": false,
"version": null,
"ecosystem": "nuget"
},
{
"name": "System.Threading.Tasks.Extensions",
"direct": false,
"version": null,
"ecosystem": "nuget"
}
],
"collected": true,
"truncated": false,
"total_count": 22,
"direct_count": 0,
"indirect_count": 22
}
},
"maintainership": {
"issues": {
"open_prs": 1,
"merged_prs": 285,
"open_issues": 6,
"closed_ratio": 0.867,
"closed_issues": 39,
"closed_unmerged_prs": 6
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "brantburnett",
"commits": 457,
"avatar_url": "https://avatars.githubusercontent.com/u/7118719?v=4"
},
{
"type": "User",
"login": "RobRobertsCE",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/7315745?v=4"
},
{
"type": "User",
"login": "djonesCenterEdge",
"commits": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/61988618?v=4"
},
{
"type": "User",
"login": "cbrower-centeredge",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/54110099?v=4"
},
{
"type": "User",
"login": "mmmasent",
"commits": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/29384916?v=4"
}
],
"contributors_sampled": 5,
"top_contributor_share": 0.987
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"build.yml",
"cleanup-packages.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": true,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"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": null,
"reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 10,
"reason": "30 out of 30 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": 10,
"reason": "all changesets reviewed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"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": 0,
"reason": "no 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": "16 commit(s) and 0 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": 10,
"reason": "SAST tool is 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": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 9,
"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": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "101897b84dbaa2537f40bb6099a9fbe60d73165e",
"ran_at": "2026-07-30T13:50:59Z",
"aggregate_score": 6.9,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-30T13:38:04Z",
"oldest_open_prs": [
{
"number": 160,
"created_at": "2023-01-11T08:54:53Z",
"last_comment_at": "2023-01-11T13:55:04Z",
"last_comment_author": "tagz97"
}
],
"last_merged_pr_at": "2026-07-30T13:12:01Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 8,
"created_at": "2020-11-23T04:57:43Z",
"last_comment_at": "2020-11-23T05:03:00Z",
"last_comment_author": "mmmasent"
},
{
"number": 17,
"created_at": "2021-02-18T03:42:39Z",
"last_comment_at": "2021-03-05T20:13:16Z",
"last_comment_author": "brantburnett"
},
{
"number": 18,
"created_at": "2021-02-19T03:10:48Z",
"last_comment_at": null,
"last_comment_author": null
},
{
"number": 162,
"created_at": "2023-02-10T15:49:28Z",
"last_comment_at": "2024-07-19T16:17:38Z",
"last_comment_author": "brantburnett"
},
{
"number": 173,
"created_at": "2023-03-21T03:07:27Z",
"last_comment_at": "2023-03-21T12:34:39Z",
"last_comment_author": "brantburnett"
},
{
"number": 199,
"created_at": "2023-08-14T14:53:42Z",
"last_comment_at": "2023-08-14T15:29:46Z",
"last_comment_author": "brantburnett"
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/CenterEdge/Yardarm",
"host": "github.com",
"name": "Yardarm",
"owner": "CenterEdge"
},
"metrics": {
"overall": {
"key": "overall",
"band": "good",
"name": "Overall health",
"note": "The weighted overall 67 is calibrated to 78 on the published index scale (record calibration 2026-08-02).",
"notes": [
{
"code": "overall_calibration",
"params": {
"raw": 67,
"calibrated": 78,
"calibration": "2026-08-02"
}
}
],
"value": 78,
"inputs": {
"security": 70,
"vitality": 81,
"community": 52,
"governance": 55,
"calibration": "2026-08-02",
"engineering": 78,
"ai_readiness": 56,
"weighted_overall_raw": 67
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "excellent",
"name": "Vitality",
"value": 81,
"weight": 0.21,
"metrics": [
{
"key": "development_activity",
"band": "good",
"name": "Development activity",
"note": null,
"notes": [],
"value": 68,
"inputs": {
"commits_last_year": 34,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 11
},
"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": "11/52 weeks with commits",
"points": 7.6,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 11
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "34 commits in the last year",
"points": 13.9,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 34
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "exceptional",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 54,
"latest_release_tag": "release/0.7.0",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 26.5
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "54 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 54
}
}
],
"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 ~26.5 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 26.5
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "exceptional",
"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": 5,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "last human commit 5 days ago",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_maintained",
"params": {
"days": 5
}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "moderate",
"name": "Community & Adoption",
"value": 52,
"weight": 0.17,
"metrics": [
{
"key": "popularity",
"band": "weak",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 37,
"inputs": {
"forks": 7,
"stars": 51,
"watchers": 4,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "51 stars",
"points": 27.6,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 51
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "7 forks",
"points": 6.5,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 7
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "4 watchers",
"points": 2.7,
"status": "partial",
"details": [
{
"code": "watchers",
"params": {
"count": 4
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "good",
"name": "Community health",
"note": null,
"notes": [],
"value": 70,
"inputs": {
"has_readme": true,
"has_license": true,
"readme_badges": null,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": false,
"readme_badge_services": [],
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (Apache-2.0)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "Apache-2.0"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"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": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "moderate",
"name": "Sustainability & Governance",
"value": 55,
"weight": 0.23,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 19,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 5,
"top_contributor_share": 0.987
},
"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 99% of commits",
"points": 0.3,
"status": "partial",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 99
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "5 contributors",
"points": 6.8,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 5
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "exceptional",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"newcomer_pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 93,
"inputs": {
"merged_prs": 285,
"open_issues": 6,
"closed_issues": 39,
"prs_merged_7d": null,
"prs_decided_7d": null,
"prs_merged_30d": null,
"prs_decided_30d": null,
"issue_closed_ratio": 0.867,
"closed_unmerged_prs": 6,
"first_time_authors_30d": null,
"first_time_prs_merged_30d": null,
"first_time_prs_decided_30d": null
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "87% of issues closed",
"points": 36.4,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 87
}
}
],
"max_points": 42
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "285/291 decided PRs merged",
"points": 29.4,
"status": "partial",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 285,
"decided": 291
}
}
],
"max_points": 30
},
{
"key": "newcomer_pr_acceptance",
"name": "Newcomer PR acceptance",
"detail": "no first-time contributor's PR decided in 30d",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_newcomer_prs",
"params": {
"days": 30
}
}
],
"max_points": 13
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "all changesets reviewed",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"followers": 9,
"owner_type": "Organization",
"is_verified": null,
"owner_login": "CenterEdge",
"public_repos": 39,
"account_age_days": 4503
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "organization-owned",
"points": 30,
"status": "met",
"details": [
{
"code": "owner_organization",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "9 followers of CenterEdge",
"points": 7.2,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 9,
"login": "CenterEdge"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "39 public repos, account ~12 yr old",
"points": 23.7,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 39
}
},
{
"code": "account_age_years",
"params": {
"years": 12
}
}
],
"max_points": 25
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 78,
"weight": 0.19,
"metrics": [
{
"key": "engineering_practices",
"band": "good",
"name": "Engineering practices",
"note": null,
"notes": [],
"value": 74,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": true,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "2 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 2
}
}
],
"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": 6.4,
"status": "met",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "30 out of 30 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": 85,
"inputs": {
"topics": [
"hacktoberfest",
"csharp",
"openapi",
"hacktoberfest2025"
],
"has_wiki": true,
"homepage": null,
"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": null,
"points": 0,
"status": "missed",
"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": "4 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 4
}
}
],
"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": "good",
"name": "Security",
"value": 70,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "good",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): Branch-Protection, Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"branch_protection",
"signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 70,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 6.9
},
"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": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "30 out of 30 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": "all changesets reviewed",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"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": "no update tool detected",
"points": 0,
"status": "missed",
"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": "16 commit(s) and 0 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 is run on all commits",
"points": 5,
"status": "met",
"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": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 6.8,
"status": "partial",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "exceptional",
"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"
],
"commit_weight_rule": {
"min_commits": 50,
"min_commit_share": 0.1
},
"review_only_matches": 0,
"below_threshold_exposures": [],
"assessed_self_published_locations": 4
},
"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": "moderate",
"name": "AI Readiness",
"value": 56,
"weight": 0.04,
"metrics": [
{
"key": "ai_agent_context",
"band": "weak",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.01,
"toolchain_manifests": [
"src/main/Yardarm.Benchmarks/Yardarm.Benchmarks.csproj",
"src/main/Yardarm.Client.UnitTests/Yardarm.Client.UnitTests.csproj",
"src/main/Yardarm.Client/Yardarm.Client.csproj",
"src/main/Yardarm.CommandLine/Yardarm.CommandLine.csproj",
"src/main/Yardarm.MicrosoftExtensionsHttp.Client/Yardarm.MicrosoftExtensionsHttp.Client.csproj",
"src/main/Yardarm.MicrosoftExtensionsHttp/Yardarm.MicrosoftExtensionsHttp.csproj",
"src/main/Yardarm.NewtonsoftJson.Client/Yardarm.NewtonsoftJson.Client.csproj",
"src/main/Yardarm.NewtonsoftJson/Yardarm.NewtonsoftJson.csproj",
"src/main/Yardarm.NodaTime.Client/Yardarm.NodaTime.Client.csproj",
"src/main/Yardarm.NodaTime.UnitTests/Yardarm.NodaTime.UnitTests.csproj",
"src/main/Yardarm.NodaTime/Yardarm.NodaTime.csproj",
"src/main/Yardarm.SystemTextJson.Client/Yardarm.SystemTextJson.Client.csproj",
"src/main/Yardarm.SystemTextJson.UnitTests/Yardarm.SystemTextJson.UnitTests.csproj",
"src/main/Yardarm.SystemTextJson/Yardarm.SystemTextJson.csproj",
"src/main/Yardarm.UnitTests/Yardarm.UnitTests.csproj",
"src/main/Yardarm/Yardarm.csproj",
"src/sdk/Yardarm.Sdk.Test/Yardarm.Sdk.Test.csproj",
"src/sdk/Yardarm.Sdk/Yardarm.Sdk.csproj"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "src/main/Yardarm.Benchmarks/Yardarm.Benchmarks.csproj, src/main/Yardarm.Client.UnitTests/Yardarm.Client.UnitTests.csproj, src/main/Yardarm.Client/Yardarm.Client.csproj (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "src/main/Yardarm.Benchmarks/Yardarm.Benchmarks.csproj, src/main/Yardarm.Client.UnitTests/Yardarm.Client.UnitTests.csproj, src/main/Yardarm.Client/Yardarm.Client.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": "Dockerfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "1 of the last 100 commits agent-authored or agent-credited",
"points": 2,
"status": "partial",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 1,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"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": "exceptional",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "C#",
"largest_source_bytes": 26314,
"source_files_sampled": 418,
"oversized_source_files": 0
},
"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": "0/418 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 418,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "weak",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [],
"has_mcp_signal": false,
"api_schema_files": [
"src/main/Yardarm.CommandLine/swagger.json"
]
},
"components": [
{
"key": "api_schema_openapi_graphql_proto",
"name": "API schema (OpenAPI/GraphQL/proto)",
"detail": "src/main/Yardarm.CommandLine/swagger.json",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "src/main/Yardarm.CommandLine/swagger.json"
}
}
],
"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": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 40
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
}
],
"classification": {
"top": [],
"labels": [],
"scores": {
"library": 2,
"network-service": 3
},
"primary": null,
"evidence": [
{
"tier": "structure",
"label": "network-service",
"source": "api_schema",
"weight": 3
},
{
"tier": "description",
"label": "library",
"source": "description:library",
"weight": 2
}
],
"artifacts": [],
"confidence": "none",
"host_extension": false,
"runs_as_process": false,
"consumed_by_code": false
},
"metrics_version": "2.5.0"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"No resolved dependencies carried a version and a supported ecosystem"
],
"report_type": "repository",
"generated_at": "2026-07-30T13:51:21.847068Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/CenterEdge/Yardarm.svg",
"full_name": "CenterEdge/Yardarm",
"license_state": "standard",
"license_spdx": "Apache-2.0"
}