公开记录
软件健康报告模式 0.27.0 · 指标 2.5.0 · 2026-07-30 13:51 UTC

CenterEdge / Yardarm

OpenAPI 3 SDK Generator for C#

C#Apache-2.0★ 51 星标⑂ 7 复刻始于 2020年7月在 GitHub 上查看 ↗

CenterEdge/Yardarm 的健康指数为 100 分中的 78 分,处于「良好」区间。 其得分最高的类别是Vitality(81/100),最低的是Community & Adoption(52/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

78
总分 / 100
良好

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均,再依据公开记录的分布进行校准,使各等级具有百分位含义;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 34(存在风险)的上限。

78
卓越93-100公开记录中的最高层级(约前 5%);基本满足所有检验标准
优秀80-92各方面均表现强劲;仅有少量不足
良好65-79健康;不足之处有限且可控
中等50-64可接受,但存在明显不足;建议进行审查
薄弱35-49多个领域存在实质性薄弱环节
存在风险20-34存在重大薄弱环节;采用时应保持审慎
危急1-19问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

加权总体分 67 经校准后在公布的指数量表上为 78(记录校准 2026-08-02)。

所有权

9 关注者39 个公开仓库始于 2014年3月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

81优秀 · 占总体的 21%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
7.6/36提交节奏 — 52 周中有 11 周有提交
13.9/18提交量 — 最近一年 34 次提交
10/10OpenSSF Scorecard:Maintained — 16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year34
human_commit_share1
days_since_last_push0
active_weeks_last_year11

发布纪律

100卓越
评分方式
27/27有发布版本 — 已发布 54 个发布版本
36/36发布时效 — 最近一次发布版本于 0 天前
27/27发布节奏 — 约每 26.5 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count54
latest_release_tagrelease/0.7.0
releases_from_tags
days_since_latest_release0
mean_days_between_releases26.5
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

52中等 · 占总体的 17%
评分方式
27.6/60星标 — 51 个星标
6.5/25复刻 — 7 个复刻
2.7/15关注者 — 4 位关注者
所用输入
forks7
stars51
watchers4
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

70良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.0)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
readme_badges
has_contributing
has_issue_template
has_code_of_conduct
readme_badge_services
has_pull_request_template

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

55中等 · 占总体的 23%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0.3/22.5提交分布 — 头号贡献者编写了 99% 的提交
6.8/13.5贡献者广度 — 5 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled5
top_contributor_share0.987
评分方式
36.4/42议题解决 — 87% 的议题已关闭
29.4/30PR 接受 — 已裁定的 PR 中 285/291 已合并
0/13Newcomer PR acceptance — 30 天内没有首次贡献者的 PR 得到裁决
15/15OpenSSF Scorecard:Code-Review — all changesets reviewed
所用输入
merged_prs285
open_issues6
closed_issues39
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio0.867
closed_unmerged_prs6
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
已排除计分(无数据或不适用):newcomer_pr_acceptance。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
7.2/25所有者影响力 — CenterEdge 有 9 位关注者
23.7/25既往记录 — 39 个公开仓库,账户约 12 年
所用输入
followers9
owner_typeOrganization
is_verified
owner_loginCenterEdge
public_repos39
account_age_days4,503

工程质量

基础的工程与文档实践是否到位?

78良好 · 占总体的 19%

工程实践

74良好
评分方式
24/24CI 工作流 — 2 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
6.4/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

85优秀
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
10/10主题标签 — 4 个主题标签
10/10Wiki
所用输入
topicshacktoberfest, csharp, openapi, hacktoberfest2025
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

70良好 · 占总体的 16%

安全态势

70良好
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — 无数据
2.5/2.5CI-Tests — 30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
7.5/7.5Code-Review — all changesets reviewed
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
7.5/7.5Maintained — 16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
5/5SAST — SAST tool is run on all commits
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
6.8/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate6.9
已排除计分(无数据或不适用):branch_protection, signed_releases。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?权重刻意设小(4%):代理工具链是一项真实的维护信号,但完全不具备的仓库仍可达到 100/100。

56中等 · 占总体的 4%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 100 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
评分方式
12.6/18一条命令的引导启动 — src/main/Yardarm.Benchmarks/Yardarm.Benchmarks.csproj, src/main/Yardarm.Client.UnitTests/Yardarm.Client.UnitTests.csproj, src/main/Yardarm.Client/Yardarm.Client.csproj(工具链约定,无任务运行器)
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — C#(静态类型)
10/10可复现环境 — Dockerfile
2/10已体现的代理实践 — 最近 100 次提交中有 1 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.01
toolchain_manifestssrc/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_share0
评分方式
45/45可类型检查的代码 — C#(静态类型)
55/55可控的文件大小 — 采样的 418 个源文件中有 0 个超过 60KB
所用输入
primary_languageC#
largest_source_bytes26,314
source_files_sampled418
oversized_source_files0
评分方式
40/40API 模式(OpenAPI/GraphQL/proto) — src/main/Yardarm.CommandLine/swagger.json
0/20MCP 服务器
0/40可运行示例
所用输入
example_dirs
has_mcp_signal
api_schema_filessrc/main/Yardarm.CommandLine/swagger.json

关键数据

51GitHub 星标
5贡献者
34最近 12 个月提交数
0距最近推送天数
54发布版本数
1巴士系数(bus factor)
6开放议题
软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • No resolved dependencies carried a version and a supported ecosystem

更多细节

Star 与 Fork 历史 0 ★ / 7 ⇿
0Star
7Fork
44发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

1234567712020-082023-062026-04
主版本 0次版本 0修订 0

每个点涵盖 6 天。

OpenSSF Scorecard 6.9 / 10
6.9综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-30 13:50 UTC

10Binary-Artifactsno binaries found in the repo
不适用Branch-Protectioninternal 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
10CI-Tests30 out of 30 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained16 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
10SASTSAST tool is run on all commits
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
9Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
全部依赖 22

来自 GitHub 依赖图的完整解析依赖集合:0 个直接依赖与 22 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
NuGetBenchmarkDotNet间接
NuGetCommandLineParser间接
NuGetMicrosoft.Build.Framework间接
NuGetMicrosoft.Build.Utilities.Core间接
NuGetMicrosoft.CodeAnalysis.CSharp间接
NuGetMicrosoft.CodeAnalysis.CSharp.Workspaces间接
NuGetMicrosoft.Extensions.DependencyInjection间接
NuGetMicrosoft.Extensions.Http间接
NuGetMicrosoft.Extensions.Logging间接
NuGetMicrosoft.Extensions.Options间接
NuGetMicrosoft.OpenApi间接
NuGetMicrosoft.OpenApi.Readers间接
NuGetNewtonsoft.Json间接
NuGetNodaTime.Serialization.SystemTextJson间接
NuGetNuGet.Commands间接
NuGetSerilog.Extensions.Logging间接
NuGetSerilog.Sinks.Console间接
NuGetSystem.Collections.Immutable间接
NuGetSystem.Linq.AsyncEnumerable间接
NuGetSystem.Net.Http.Json间接
NuGetSystem.Text.Json间接
NuGetSystem.Threading.Tasks.Extensions间接
依赖安全公告 未评估

本报告未能完成公告比对:No resolved dependencies carried a version and a supported ecosystem

原始 JSON 报告 机器可读
{
  "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"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v2.5.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计.