公开记录
软件健康报告模式 0.26.0 · 指标 1.13.0 · 2026-07-22 02:00 UTC

xapi-project / xen-api

The Xapi Project's XenAPI Server

OCaml自定义许可证★ 365 星标⑂ 302 复刻始于 2010年10月在 GitHub 上查看 ↗

xapi-project/xen-api 的健康指数为 100 分中的 84 分,处于「良好」区间。 其得分最高的类别是Vitality(96/100),最低的是AI Readiness(64/100)。 最近一次更新在今天。 近期的大部分工作由 5 位贡献者完成。

84
总分 / 100
良好

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

84
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

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

所有权

53 关注者102 个公开仓库始于 2010年6月

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

按类别列示的指标

活力

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

96优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
36/36提交节奏 — 52 周中有 52 周有提交
18/18提交量 — 最近一年 1,185 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year1,185
human_commit_share0.99
days_since_last_push0
active_weeks_last_year52

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 100 个发布版本
36/36发布时效 — 最近一次发布版本于 0 天前
27/27发布节奏 — 约每 7 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count100
latest_release_tagv26.1.17
releases_from_tags
days_since_latest_release0
mean_days_between_releases7

社区与采用

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

68中等 · 占总体的 18%
评分方式
41.5/60星标 — 365 个星标
20.7/25复刻 — 302 个复刻
9.4/15关注者 — 51 位关注者
所用输入
forks302
stars365
watchers51
growth_stateorganic
growth_factor_pct100

社区健康

64中等
评分方式
22.5/22.5README
16.9/22.5许可证 — 存在许可证文件,但不是可识别的许可证
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

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

77良好 · 占总体的 24%
评分方式
45.9/54巴士系数 — 5 位贡献者贡献了半数提交
18.6/22.5提交分布 — 头号贡献者编写了 18% 的提交
13.5/13.5贡献者广度 — 100 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 33 contributing companies or organizations
所用输入
bus_factor5
contributors_sampled100
top_contributor_share0.175
评分方式
25.2/46.8议题解决 — 54% 的议题已关闭
34/38.3PR 接受 — 已裁定的 PR 中 6,210/6,992 已合并
15/15OpenSSF Scorecard:Code-Review — all changesets reviewed
所用输入
merged_prs6,210
open_issues82
closed_issues96
issue_closed_ratio0.539
closed_unmerged_prs782
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
12.5/25所有者影响力 — xapi-project 有 53 位关注者
25/25既往记录 — 102 个公开仓库,账户约 16 年
所用输入
followers53
owner_typeOrganization
is_verified
owner_loginxapi-project
public_repos102
account_age_days5,866

工程质量

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

96优秀 · 占总体的 20%

工程实践

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

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://xenproject.org/projects/xapi/
10/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepagehttps://xenproject.org/projects/xapi/
has_readme
has_docs_dir
has_description

安全

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

78良好 · 占总体的 16%

安全态势

72良好
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
6/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 11 out of 11 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
2.5/2.5Contributors — project has 33 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.2/2.5许可证 — license file detected
7.5/7.5Maintained — 30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
5/5SAST — SAST tool is run on all commits
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
5.2/7.5Vulnerabilities — 3 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate7.2
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
0/25间接依赖不含已知公告 — 在此范围内,传递依赖集合无法与开发和测试依赖区分
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories2
affected_packages1
assessed_packages16
unassessed_packages1
affected_by_severitymoderate 1
direct_affected_packages0
已排除计分(无数据或不适用):间接依赖不含已知公告, 没有长期未处理的公告。 其余权重已重新归一化。 已将 16 个已解析依赖与 OSV 比对。 有 1 项无法评估——没有已解析的版本、生态系统不受支持,或超出所报告的软件包清单。 该仓库未发布任何索引可解析的软件包,因此改为评估仓库依赖图。该图将开发与测试版本固定同交付的依赖混在一起,因此仅对声明的运行时依赖计分;传递性发现仅作为背景信息列出,不计入评分。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

64中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 99 次人类提交中有 90 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.909
agent_instruction_files
agent_instruction_max_bytes
评分方式
18/18一条命令的引导启动 — Makefile, ocaml/forkexecd/helper/Makefile, ocaml/ktls-helper/helper/Makefile, ocaml/libs/vhd/Makefile, ocaml/libs/xenctrl-ext/Makefile, ocaml/xapi-storage/python/Makefile, python3/Makefile, python3/examples/Makefile, scripts/Makefile, unixpwd/Makefile
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — OCaml(静态类型)
0/10可复现环境
8/10已体现的代理实践 — 最近 100 次提交中有 4 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 1 次为自动依赖更新
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_filesMakefile, ocaml/forkexecd/helper/Makefile, ocaml/ktls-helper/helper/Makefile, ocaml/libs/vhd/Makefile, ocaml/libs/xenctrl-ext/Makefile, ocaml/xapi-storage/python/Makefile, python3/Makefile, python3/examples/Makefile, scripts/Makefile, unixpwd/Makefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.04
toolchain_manifestsdoc/go.mod, ocaml/sdk-gen/component-test/jsonrpc-client/go/go.mod, ocaml/sdk-gen/csharp/autogen/XenServerTest/XenServerTest.csproj, ocaml/sdk-gen/csharp/autogen/src/XenServer.csproj, ocaml/sdk-gen/go/autogen/src/go.mod, ocaml/sdk-gen/java/autogen/xen-api/pom.xml, ocaml/sdk-gen/powershell/autogen/src/XenServerPowerShell.csproj
dependency_bot_commit_share0.01
评分方式
45/45可类型检查的代码 — OCaml(静态类型)
54.7/55可控的文件大小 — 采样的 184 个源文件中有 1 个超过 60KB
所用输入
primary_languageOCaml
largest_source_bytes93,868
source_files_sampled184
oversized_source_files1

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — example, examples
所用输入
example_dirsexample, examples
has_mcp_signal
api_schema_files

关键数据

365GitHub 星标
100贡献者
1,185最近 12 个月提交数
0距最近推送天数
100发布版本数
5巴士系数(bus factor)
82开放议题
Go, PyPI软件包生态系统数

数据采集警告

  • Could not fetch pypi package 'xen-api' from its registry

更多细节

Star 与 Fork 历史 365 ★ / 302 ⇿
365Star
302Fork
93发布

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

0125250375363284392010-102018-082026-06
主版本 2次版本 73修订 18

每个点涵盖 15 天。

OpenSSF Scorecard 7.2 / 10
7.2综合

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

10Binary-Artifactsno binaries found in the repo
8Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests11 out of 11 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
10Contributorsproject has 33 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
9Licenselicense file detected
10Maintained30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
10SASTSAST tool is run on all commits
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
7Vulnerabilities3 existing vulnerabilities detected
全部依赖 17

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

注册表软件包版本关系
Gogithub.com/mcshelby/hugo-theme-relearn0.0.0-20250126200037-60bb1c65c5fc间接
Mavencom.fasterxml.jackson.core:jackson-databind2.22.0间接
Mavenorg.apache.httpcomponents.client5:httpclient55.3间接
Mavenorg.apache.maven.plugins:maven-compiler-plugin3.12.1间接
Mavenorg.apache.maven.plugins:maven-javadoc-plugin3.6.3间接
Mavenorg.apache.maven.plugins:maven-source-plugin3.3.0间接
Mavenorg.apache.maven.plugins:maven-surefire-plugin3.5.0间接
Mavenorg.junit.jupiter:junit-jupiter5.11.1间接
NuGetcoverlet.collector3.2.0间接
NuGetMicrosoft.NET.Test.Sdk17.5.0间接
NuGetMicrosoft.PowerShell.5.ReferenceAssemblies1.1.0间接
NuGetMSTest.TestAdapter2.2.10间接
NuGetMSTest.TestFramework2.2.10间接
NuGetNewtonsoft.Json13.0.3间接
NuGetSystem.Management.Automation7.4.14间接
NuGetXenServer.NET0.0.0间接
PyPIaiohttp间接
依赖安全公告 1

该仓库未发布可被索引解析的包,因此评估的是其自身的依赖图——共 16 个包,其中也包含从不交付的开发与测试版本固定:1 个存在已知公告,0 个为直接依赖。 有 1 个无法评估——没有已解析的版本、生态系统不受支持,或不在所列包清单之内。

软件包版本关系严重程度公告数修复版本
com.fasterxml.jackson.core:jackson-databind2.22.0间接23.2.1

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 95370,
      "has_wiki": true,
      "homepage": "https://xenproject.org/projects/xapi/",
      "languages": {
        "C": 216972,
        "C#": 211694,
        "Go": 56561,
        "Awk": 2212,
        "CSS": 4815,
        "Dune": 16367,
        "HTML": 8686,
        "Java": 49804,
        "Perl": 19100,
        "Raku": 10741,
        "Roff": 2855,
        "OCaml": 12620629,
        "Shell": 133910,
        "Python": 648662,
        "Makefile": 24821,
        "Mustache": 129805,
        "JavaScript": 12624,
        "PowerShell": 2047,
        "Standard ML": 10317
      },
      "pushed_at": "2026-07-21T07:29:17Z",
      "created_at": "2010-10-04T10:52:57Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-21T07:28:16Z",
      "description": "The Xapi Project's XenAPI Server",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "master",
      "license_spdx_raw": "NOASSERTION",
      "primary_language": "OCaml",
      "significant_languages": [
        "OCaml"
      ]
    },
    "owner": {
      "blog": "http://xenproject.org/developers/teams/xapi.html",
      "name": "Xapi Project",
      "type": "Organization",
      "login": "xapi-project",
      "company": null,
      "location": "Cambridge, UK",
      "followers": 53,
      "avatar_url": "https://avatars.githubusercontent.com/u/317268?v=4",
      "created_at": "2010-06-29T09:31:21Z",
      "is_verified": null,
      "public_repos": 102,
      "account_age_days": 5866
    },
    "license": {
      "state": "custom",
      "spdx_id": null,
      "raw_spdx": "NOASSERTION",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v26.1.17",
          "kind": "patch",
          "published_at": "2026-07-21T03:04:19Z"
        },
        {
          "tag": "v26.16.1",
          "kind": "patch",
          "published_at": "2026-07-17T02:33:01Z"
        },
        {
          "tag": "v26.1.16",
          "kind": "patch",
          "published_at": "2026-07-15T07:36:06Z"
        },
        {
          "tag": "v26.15.1",
          "kind": "patch",
          "published_at": "2026-07-14T11:08:11Z"
        },
        {
          "tag": "v26.16.0",
          "kind": "minor",
          "published_at": "2026-07-03T02:34:37Z"
        },
        {
          "tag": "v26.1.15",
          "kind": "patch",
          "published_at": "2026-07-02T10:07:06Z"
        },
        {
          "tag": "v26.1.14",
          "kind": "patch",
          "published_at": "2026-06-30T01:41:24Z"
        },
        {
          "tag": "v26.15.0",
          "kind": "minor",
          "published_at": "2026-06-03T01:40:23Z"
        },
        {
          "tag": "v26.1.13",
          "kind": "patch",
          "published_at": "2026-06-02T03:17:35Z"
        },
        {
          "tag": "v26.14.0",
          "kind": "minor",
          "published_at": "2026-05-19T09:37:10Z"
        },
        {
          "tag": "v26.1.12",
          "kind": "patch",
          "published_at": "2026-05-11T09:31:16Z"
        },
        {
          "tag": "v26.13.0",
          "kind": "minor",
          "published_at": "2026-05-07T01:46:41Z"
        },
        {
          "tag": "v26.1.11",
          "kind": "patch",
          "published_at": "2026-04-29T15:15:58Z"
        },
        {
          "tag": "v26.12.0",
          "kind": "minor",
          "published_at": "2026-04-29T09:49:58Z"
        },
        {
          "tag": "v26.11.0",
          "kind": "minor",
          "published_at": "2026-04-24T05:03:21Z"
        },
        {
          "tag": "v26.1.10",
          "kind": "patch",
          "published_at": "2026-04-21T10:02:00Z"
        },
        {
          "tag": "v26.1.9",
          "kind": "patch",
          "published_at": "2026-04-15T09:48:08Z"
        },
        {
          "tag": "v26.10.0",
          "kind": "minor",
          "published_at": "2026-04-15T09:18:39Z"
        },
        {
          "tag": "v26.1.8",
          "kind": "patch",
          "published_at": "2026-04-14T03:32:07Z"
        },
        {
          "tag": "v26.9.0",
          "kind": "minor",
          "published_at": "2026-04-14T02:04:05Z"
        },
        {
          "tag": "v26.1.7",
          "kind": "patch",
          "published_at": "2026-03-31T05:39:25Z"
        },
        {
          "tag": "v26.8.0",
          "kind": "minor",
          "published_at": "2026-03-31T02:49:08Z"
        },
        {
          "tag": "v26.1.6",
          "kind": "patch",
          "published_at": "2026-03-19T09:24:21Z"
        },
        {
          "tag": "v26.7.0",
          "kind": "minor",
          "published_at": "2026-03-19T08:49:12Z"
        },
        {
          "tag": "v26.1.5",
          "kind": "patch",
          "published_at": "2026-03-10T02:55:33Z"
        },
        {
          "tag": "v26.6.0",
          "kind": "minor",
          "published_at": "2026-03-05T10:57:59Z"
        },
        {
          "tag": "v26.5.0",
          "kind": "minor",
          "published_at": "2026-02-12T14:32:15Z"
        },
        {
          "tag": "v26.1.3",
          "kind": "patch",
          "published_at": "2026-02-19T13:45:10Z"
        },
        {
          "tag": "v26.1.2",
          "kind": "patch",
          "published_at": "2026-02-19T13:44:47Z"
        },
        {
          "tag": "v26.4.0",
          "kind": "minor",
          "published_at": "2026-02-04T17:13:56Z"
        },
        {
          "tag": "v26.1.1",
          "kind": "patch",
          "published_at": "2026-02-19T13:43:23Z"
        },
        {
          "tag": "v26.3.0",
          "kind": "minor",
          "published_at": "2026-01-30T13:32:03Z"
        },
        {
          "tag": "v26.2.0",
          "kind": "minor",
          "published_at": "2026-01-19T14:44:22Z"
        },
        {
          "tag": "v26.1.0",
          "kind": "minor",
          "published_at": "2026-01-13T16:04:47Z"
        },
        {
          "tag": "v26.0.0",
          "kind": "major",
          "published_at": "2026-01-08T16:13:54Z"
        },
        {
          "tag": "v25.37.1",
          "kind": "patch",
          "published_at": "2025-12-16T16:10:01Z"
        },
        {
          "tag": "v25.38.0",
          "kind": "minor",
          "published_at": "2025-11-27T11:19:32Z"
        },
        {
          "tag": "v25.37.0",
          "kind": "minor",
          "published_at": "2025-11-12T14:39:36Z"
        },
        {
          "tag": "v25.33.2",
          "kind": "patch",
          "published_at": "2025-11-11T12:30:45Z"
        },
        {
          "tag": "v25.36.0",
          "kind": "minor",
          "published_at": "2025-10-31T16:03:57Z"
        },
        {
          "tag": "v25.33.1",
          "kind": "patch",
          "published_at": "2025-10-30T13:47:50Z"
        },
        {
          "tag": "v25.35.0",
          "kind": "minor",
          "published_at": "2025-10-29T11:20:25Z"
        },
        {
          "tag": "v25.34.0",
          "kind": "minor",
          "published_at": "2025-10-22T16:02:00Z"
        },
        {
          "tag": "v25.33.0",
          "kind": "minor",
          "published_at": "2025-10-14T15:43:51Z"
        },
        {
          "tag": "v25.32.0",
          "kind": "minor",
          "published_at": "2025-09-30T15:02:35Z"
        },
        {
          "tag": "v25.31.0",
          "kind": "minor",
          "published_at": "2025-09-24T13:36:10Z"
        },
        {
          "tag": "v25.30.0",
          "kind": "minor",
          "published_at": "2025-09-02T14:37:56Z"
        },
        {
          "tag": "v25.29.0",
          "kind": "minor",
          "published_at": "2025-08-21T09:14:11Z"
        },
        {
          "tag": "v25.28.0",
          "kind": "minor",
          "published_at": "2025-08-06T12:44:07Z"
        },
        {
          "tag": "v25.27.0",
          "kind": "minor",
          "published_at": "2025-07-22T11:12:58Z"
        },
        {
          "tag": "v25.26.0",
          "kind": "minor",
          "published_at": "2025-07-16T12:16:42Z"
        },
        {
          "tag": "v25.25.0",
          "kind": "minor",
          "published_at": "2025-07-13T13:49:00Z"
        },
        {
          "tag": "v25.24.0",
          "kind": "minor",
          "published_at": "2025-07-08T09:16:11Z"
        },
        {
          "tag": "v25.23.0",
          "kind": "minor",
          "published_at": "2025-06-25T03:37:28Z"
        },
        {
          "tag": "v25.22.0",
          "kind": "minor",
          "published_at": "2025-06-11T10:36:15Z"
        },
        {
          "tag": "v25.21.0",
          "kind": "minor",
          "published_at": "2025-06-06T01:43:42Z"
        },
        {
          "tag": "v25.20.0",
          "kind": "minor",
          "published_at": "2025-05-23T01:29:57Z"
        },
        {
          "tag": "v25.19.0",
          "kind": "minor",
          "published_at": "2025-05-14T23:21:51Z"
        },
        {
          "tag": "v25.18.0",
          "kind": "minor",
          "published_at": "2025-05-08T14:48:48Z"
        },
        {
          "tag": "v25.17.0",
          "kind": "minor",
          "published_at": "2025-04-24T05:56:28Z"
        },
        {
          "tag": "v25.16.0",
          "kind": "minor",
          "published_at": "2025-04-15T11:08:20Z"
        },
        {
          "tag": "v25.15.0",
          "kind": "minor",
          "published_at": "2025-04-08T10:32:08Z"
        },
        {
          "tag": "v25.14.0",
          "kind": "minor",
          "published_at": "2025-03-18T12:34:32Z"
        },
        {
          "tag": "v25.13.0",
          "kind": "minor",
          "published_at": "2025-03-17T11:54:19Z"
        },
        {
          "tag": "v25.12.0",
          "kind": "minor",
          "published_at": "2025-03-12T13:08:35Z"
        },
        {
          "tag": "v25.11.0",
          "kind": "minor",
          "published_at": "2025-03-11T12:30:56Z"
        },
        {
          "tag": "v25.10.0",
          "kind": "minor",
          "published_at": "2025-03-07T12:34:58Z"
        },
        {
          "tag": "v25.9.0",
          "kind": "minor",
          "published_at": "2025-02-28T11:14:55Z"
        },
        {
          "tag": "v25.7.0",
          "kind": "minor",
          "published_at": "2025-02-18T11:24:48Z"
        },
        {
          "tag": "v25.6.0",
          "kind": "minor",
          "published_at": "2025-02-10T11:05:17Z"
        },
        {
          "tag": "v25.5.0",
          "kind": "minor",
          "published_at": "2025-02-03T12:17:16Z"
        },
        {
          "tag": "v25.4.0",
          "kind": "minor",
          "published_at": "2025-01-29T13:52:04Z"
        },
        {
          "tag": "v25.3.0",
          "kind": "minor",
          "published_at": "2025-01-27T12:35:51Z"
        },
        {
          "tag": "v25.2.0",
          "kind": "minor",
          "published_at": "2025-01-17T10:25:50Z"
        },
        {
          "tag": "v24.39.1",
          "kind": "patch",
          "published_at": "2025-01-15T16:22:50Z"
        },
        {
          "tag": "v25.1.0",
          "kind": "minor",
          "published_at": "2025-01-15T12:12:44Z"
        },
        {
          "tag": "v25.0.0",
          "kind": "major",
          "published_at": "2025-01-09T05:57:34Z"
        },
        {
          "tag": "v24.40.0",
          "kind": "minor",
          "published_at": "2024-12-18T09:50:31Z"
        },
        {
          "tag": "v24.39.0",
          "kind": "minor",
          "published_at": "2024-11-25T10:25:48Z"
        },
        {
          "tag": "v24.38.0",
          "kind": "minor",
          "published_at": "2024-11-25T09:44:42Z"
        },
        {
          "tag": "v24.37.0",
          "kind": "minor",
          "published_at": "2024-11-11T13:57:37Z"
        },
        {
          "tag": "v24.36.0",
          "kind": "minor",
          "published_at": "2024-10-29T10:13:12Z"
        },
        {
          "tag": "v24.35.0",
          "kind": "minor",
          "published_at": "2024-10-23T09:38:59Z"
        },
        {
          "tag": "v24.34.0",
          "kind": "minor",
          "published_at": "2024-10-21T15:47:26Z"
        },
        {
          "tag": "v24.33.0",
          "kind": "minor",
          "published_at": "2024-10-14T09:45:30Z"
        },
        {
          "tag": "v24.32.0",
          "kind": "minor",
          "published_at": "2024-10-10T08:45:20Z"
        },
        {
          "tag": "v24.31.0",
          "kind": "minor",
          "published_at": "2024-10-04T08:59:48Z"
        },
        {
          "tag": "v24.30.0",
          "kind": "minor",
          "published_at": "2024-09-23T12:30:20Z"
        },
        {
          "tag": "v24.29.0",
          "kind": "minor",
          "published_at": "2024-09-16T12:29:57Z"
        },
        {
          "tag": "v24.28.0",
          "kind": "minor",
          "published_at": "2024-09-10T09:52:27Z"
        },
        {
          "tag": "v24.27.0",
          "kind": "minor",
          "published_at": "2024-09-04T10:51:24Z"
        },
        {
          "tag": "v24.26.0",
          "kind": "minor",
          "published_at": "2024-08-29T12:59:20Z"
        },
        {
          "tag": "v24.25.0",
          "kind": "minor",
          "published_at": "2024-08-29T09:24:03Z"
        },
        {
          "tag": "v24.24.0",
          "kind": "minor",
          "published_at": "2024-08-22T09:56:22Z"
        },
        {
          "tag": "v24.23.0",
          "kind": "minor",
          "published_at": "2024-08-20T09:51:44Z"
        },
        {
          "tag": "v24.22.0",
          "kind": "minor",
          "published_at": "2024-08-15T08:58:01Z"
        },
        {
          "tag": "v24.21.0",
          "kind": "minor",
          "published_at": "2024-07-26T11:05:02Z"
        },
        {
          "tag": "v24.20.0",
          "kind": "minor",
          "published_at": "2024-07-24T03:10:06Z"
        },
        {
          "tag": "v24.19.2",
          "kind": "patch",
          "published_at": "2024-07-16T04:04:51Z"
        },
        {
          "tag": "v24.19.1",
          "kind": "patch",
          "published_at": "2024-07-09T12:25:31Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "b08a580bbf78d2a774a065ed21b135c0af14a3cf",
          "body": "Following #7181, after renaming to README.md, the Makefile need to be\nupdated to clean the README.md.\nNow koji build complains\n```\nerror: Installed (but unpackaged) file(s) found:\n   /opt/xensource/doc/xapi-debug/README.md\n   /opt/xensource/doc/xapi/README.md\n   /opt/xensource/doc/xe/README.md\n```",
          "is_bot": false,
          "headline": "Following action for README.markdown to README.md (#7183)",
          "author_name": "Andriy Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-07-21T07:19:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f13f3c9ea04eb6f60745b3a3e8574efd41dc949b",
          "body": "Signed-off-by: Changlei Li <changlei.li@citrix.com>",
          "is_bot": false,
          "headline": "Following action for README.markdown to README.md",
          "author_name": "Changlei Li",
          "author_login": "changlei-li",
          "committed_at": "2026-07-21T06:39:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2de2f25e6894cd83261b989db52c4b1b66a2a9aa",
          "body": "- update idl/datamodel to add trunks property on VIF\n- add validation constraints (trunks filtering on access port isn't\nvalid)\n- add support inside `vif-real` for initial configuration\n- add support inside xenopsd for dynamic changes\n- add test coverage to new attributes\n\nReferences:\n\n- [design\ndoc\n[…]\n-api/blob/788869e5a92e10332ba2428eb91e5a2caf4c7131/doc/content/design/vlan-filtering.md)\n\nInternal references:\n\n- XCPNG-768 : initial spike (with PoC)\n- XCPNG-3258: design\n- XCPNG-3259: implementation",
          "is_bot": false,
          "headline": "VLAN filtering on VIF (#7123)",
          "author_name": "Changlei Li",
          "author_login": "changlei-li",
          "committed_at": "2026-07-21T05:22:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1a2cfbbec6206ee5480d13edbf82f829abc448cf",
          "body": " * Rename README.markdown to README.md\n * Update lin to the OCaml web site",
          "is_bot": false,
          "headline": "Cosmetic changes to README (#7181)",
          "author_name": "Andriy Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-07-17T12:00:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "499980545670fce0b7978fcb3797aa988f29052d",
          "body": "Point to ocaml.org and use an https rather than http link\n\nSigned-off-by: Seb Hinderer <sebastien.hinderer@vates.tech>",
          "is_bot": false,
          "headline": "Update the URL of the OCaml web site",
          "author_name": "Seb Hinderer",
          "author_login": "shindere",
          "committed_at": "2026-07-17T10:12:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "473877adfc11bdde251bb9854fc0845dfa074bc1",
          "body": "The latter is more usual and there already is CONTRIBUTING.md\n\nSigned-off-by: Seb Hinderer <sebastien.hinderer@vates.tech>",
          "is_bot": false,
          "headline": "Rename README.markdown to README.md",
          "author_name": "Seb Hinderer",
          "author_login": "shindere",
          "committed_at": "2026-07-17T10:12:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f5038057f237a031506134ba9aadab0a98e38cd",
          "body": "- test_trunks_coherence_vif_set: Xapi_vif.add_trunks and Xapi_vif.set_trunks\n- test_trunks_coherence_pif_vlan: T.make_pif (Xapi_pif.pool_introduce) and Xapi_vlan.create_internal (WIP)\n\nSigned-off-by: Sebastien Rodot <sebastien.rodot@vates.tech>",
          "is_bot": false,
          "headline": "test_vif_trunks: cover more coherence checks",
          "author_name": "Sebastien Rodot",
          "author_login": "semarie",
          "committed_at": "2026-07-16T06:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "887d6ac7095b2d7c04040ee49756bb2957e21e62",
          "body": "Signed-off-by: Sebastien Rodot <sebastien.rodot@vates.tech>",
          "is_bot": false,
          "headline": "xenopsd: update xenstore while updating xapi db",
          "author_name": "Sebastien Rodot",
          "author_login": "semarie",
          "committed_at": "2026-07-16T06:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8fcd26a92dd1372c6b3b87397ba816ea7a2e07d",
          "body": "Signed-off-by: Sebastien Rodot <sebastien.rodot@vates.tech>",
          "is_bot": false,
          "headline": "xenopsd: Device.Vif.add: add trunks attribute in debug string",
          "author_name": "Sebastien Rodot",
          "author_login": "semarie",
          "committed_at": "2026-07-16T06:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "68c50c38a87d0addc743f2ab93b3b1d032033a6b",
          "body": "- update idl/datamodel to add trunks property on VIF\n- add validation constraints (trunks filtering on access port isn't valid)\n- add support inside `vif-real` for initial configuration\n- add support inside xenopsd for dynamic changes\n- add test coverage to new attributes\n\nReferences:\n\n- Design document: https://github.com/xapi-project/xen-api/blob/788869e5a92e10332ba2428eb91e5a2caf4c7131/doc/content/design/vlan-filtering.md\n\nSigned-off-by: Sebastien Rodot <sebastien.rodot@vates.tech>",
          "is_bot": false,
          "headline": "VLAN filtering on VIF",
          "author_name": "Sebastien Rodot",
          "author_login": "semarie",
          "committed_at": "2026-07-16T06:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "48db100b2b6a3e6dc3c8ab0be2b86065978437ec",
          "body": "Use a more generic message to permit to use it in other context than VLAN creation.\n\nSigned-off-by: Sebastien Marie <semarie@kapouay.eu.org>",
          "is_bot": false,
          "headline": "vlan_tag_invalid: change the documentation string",
          "author_name": "Sebastien Marie",
          "author_login": "semarie",
          "committed_at": "2026-07-16T06:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d5bcc0166ee3faf26542c8ce403abf99147d09d",
          "body": "Adds a GC rule for tunnels to remove them if one of their PIFs is\ninvalid.",
          "is_bot": false,
          "headline": "XCPNG-3545: Clear tunnels with corrupted PIFs (#7172)",
          "author_name": "Colin James",
          "author_login": "contificate",
          "committed_at": "2026-07-15T09:28:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00cb2ac8127b1a56f3e42b67f7f1b8fead775f42",
          "body": "This is XSA-498 / CVE-2026-42491.\n\nSigned-off-by: Konstantina Chremmou <konstantina.chremmou@citrix.com>\nReviewed-by: Mohammed Zahid <mohammed.zahid@citrix.com>",
          "is_bot": false,
          "headline": "[SDK] Corrected certificate validation for HTTP calls (#7176)",
          "author_name": "Ming Lu",
          "author_login": "minglumlu",
          "committed_at": "2026-07-15T02:41:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61388693abc2825c88e5a76e9b91ad9cf332d922",
          "body": "This is XSA-498 / CVE-2026-42491.\n\nSigned-off-by: Konstantina Chremmou <konstantina.chremmou@citrix.com>\nReviewed-by: Mohammed Zahid <mohammed.zahid@citrix.com>",
          "is_bot": false,
          "headline": "Corrected certificate validation for HTTP calls",
          "author_name": "Konstantina Chremmou",
          "author_login": "kc284",
          "committed_at": "2026-07-14T12:13:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "481997fac24e03eae074b87ad57b8b5c02746f21",
          "body": "…) instead of stunnel (#7154)\n\nstunnel is an external process that provides secure TLS transport for\nthe xenguest VM-migrate stream. It's a separate process from xenguest,\nand the dom0 kernel pipes the data between these processes, wasting cpu\nand memory throughput. The result is a slower VM-migrate\n[…]\nafea33095d3e70b27d0d0ee495a5950d004e4b7561780b6aebf5ebd)).\n\nActivation uses a new xenopsd.conf flag, so the existing stunnel\ndatapath remains the default.\n\nTested with:\n* performance tests\n* ring3 BVT",
          "is_bot": false,
          "headline": "CP-313264: introduce faster migration datapath using kernel TLS (kTLS…",
          "author_name": "Marcus Granado",
          "author_login": "mg12",
          "committed_at": "2026-07-14T10:12:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "94abfa90551b11786f24048fb127ef6654adccad",
          "body": "The ktls-helper prints the negotiated TLS version and cipher of the\nkTLS socket to stdout just before handing the fd to xenopsd, and\nxenopsd routes the helper's stdout and stderr to syslog under the\n\"ktls-helper\" key. The helper's output previously went to /dev/null,\nso a migration left no record of which algorithm the kTLS path\nnegotiated. Both the success line and any error line are now visible\nfor diagnostics.\n\nSigned-off-by: Marcus Granado <marcus.granado@citrix.com>",
          "is_bot": false,
          "headline": "CP-313264: xenopsd: log the negotiated kTLS version and cipher",
          "author_name": "Marcus Granado",
          "author_login": "mg12ctx",
          "committed_at": "2026-07-13T17:52:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7917d804c73ea003dfc09a7e9ea40fa48f4dac8",
          "body": "Signed-off-by: Marcus Granado <marcus.granado@citrix.com>",
          "is_bot": false,
          "headline": "CP-313264: xenopsd: migration-tls.md: add design document",
          "author_name": "Marcus Granado",
          "author_login": "mg12ctx",
          "committed_at": "2026-07-13T17:52:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d0ef6453f8ee7f36825d41fa0e300f4d87e664a",
          "body": "stunnel is an external process that provides secure TLS transport for the\nxenguest VM-migrate stream. It's a separate process from xenguest, and\nthe dom0 kernel pipes the data between these processes, wasting cpu and\nmemory throughput. The result is a slower VM-migrate experience, and\nconsequently a\n[…]\n\n\nand transparently falls back to the original Open_uri.with_open_uri so\nthe migration still proceeds using stunnel as before for the sender.\n\nSigned-off-by: Marcus Granado <marcus.granado@citrix.com>",
          "is_bot": false,
          "headline": "CP-312949: xenopsd: optional kTLS sender for VM live migration",
          "author_name": "Marcus Granado",
          "author_login": "mg12ctx",
          "committed_at": "2026-07-13T17:52:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e49a3b0ed7df907b7b2963f623434dd43f1265e",
          "body": "Adds a GC rule for tunnels to remove them if one of their PIFs is\ninvalid.\n\nTracking-reference: XCPNG-3545\nSigned-off-by: Colin James <colin.barr@vates.tech>",
          "is_bot": false,
          "headline": "XCPNG-3545: Clear tunnels with corrupted PIFs",
          "author_name": "Colin James",
          "author_login": "contificate",
          "committed_at": "2026-07-13T13:22:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7dffaf0b37308b790c6c0c9748f709412b227fed",
          "body": "Specify that an OpaqueRef of the VDI is submitted as the last argument\nto vdi_revert, not the UUID.\n\nFixes: https://github.com/xapi-project/xen-api/issues/7150",
          "is_bot": false,
          "headline": "doc: Update snapshot revert design to follow the implementation (#7170)",
          "author_name": "Andriy Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-07-10T07:38:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c518d66f57cc492368223994b81eb176890e4c69",
          "body": "Every VM import operation (VM.import, VM.import_metadata, DR recover,\ncross-pool migrate) creates the VM through create_from_record, which\ndrives\nVM.create -> Xapi_vm.create. That already computes\nsecureboot_certificates_state against the importing pool.",
          "is_bot": false,
          "headline": "Drop redundant secureboot_certificates_state recompute (#7167)",
          "author_name": "Stephen Cheng",
          "author_login": "stephenchengCloud",
          "committed_at": "2026-07-10T05:52:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "406574e9889611ec7880b95f74a047ce34f29a8d",
          "body": "Every VM import operation (VM.import, VM.import_metadata, DR recover,\ncross-pool migrate) creates the VM through create_from_record, which drives\nVM.create -> Xapi_vm.create. That already computes\nsecureboot_certificates_state against the importing pool.\n\nSigned-off-by: Stephen Cheng <stephen.cheng@citrix.com>",
          "is_bot": false,
          "headline": "Drop redundant secureboot_certificates_state recompute",
          "author_name": "Stephen Cheng",
          "author_login": null,
          "committed_at": "2026-07-10T05:24:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "85724ce12cc04733a9679b9096713b78ec61cde0",
          "body": "Specify that an OpaqueRef of the VDI is submitted as the last argument to\nvdi_revert, not the UUID.\n\nFixes: https://github.com/xapi-project/xen-api/issues/7150\nSigned-off-by: Andrii Sultanov <andriy.sultanov@vates.tech>",
          "is_bot": false,
          "headline": "doc: Update snapshot revert design to follow the implementation",
          "author_name": "Andrii Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-07-09T13:45:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9b42e6b5a166c2528d98991348765369dc9aa01",
          "body": "…cted VMs (#7145)\n\n## Why\n\nWhen HA is enabled on a pool, `host.evacuate` refuses to plan the\nevacuation of\nany VM that is not HA-protected, that is, whose `ha_restart_priority` is\nnot\n`restart`. This is by design: the HA planner only accounts for protected\nVMs, so\nunprotected ones are left out of th\n[…]\nt, CodeChecker\nand\nShellCheck all green on a fork branch). The change is a pure diagnostic\nimprovement with no change to which VMs can be evacuated, so no new\nautomated\ntest is included.\n\nCloses #4323",
          "is_bot": false,
          "headline": "xapi: report a clear error when host evacuation is blocked by unprote…",
          "author_name": "Andriy Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-07-08T14:37:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c02d204365a363d9fa996eddbad26776ae77e33",
          "body": "Microsoft's 2011 Secure Boot certificates expire between June and\nOctober 2026. XenServer already has a remediation workflow (the per-VM\nfield `VM.secureboot_certificates_state` plus\n`VM.update_secureboot_certificates_on_boot`) that lets an admin mark a\nVM so its Secure Boot certificates are replace\n[…]\nk to always return `update_required`.\n2. Use `VM.create` to trigger the logic:\n```\nTest A (flag=true):  state = update_on_boot  (expect update_on_boot)\nTest B (flag=false): state = ok  (expect ok)\n```",
          "is_bot": false,
          "headline": "auto-mark new VMs for Secure Boot certificate update on boot (#7155)",
          "author_name": "Stephen Cheng",
          "author_login": "stephenchengCloud",
          "committed_at": "2026-07-07T06:01:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "651d067aed76aeb5938187ebaa312e74d108cf6d",
          "body": "Signed-off-by: Stephen Cheng <stephen.cheng@citrix.com>",
          "is_bot": false,
          "headline": "change release version",
          "author_name": "Stephen Cheng",
          "author_login": null,
          "committed_at": "2026-07-06T09:10:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c1acbda60d325e864779a91f89be2f77df674c5",
          "body": "In VM.create, run check_secureboot_certificates_state regardless of the\npool's auto_update_vm_secureboot_certificates setting. When auto-update is\nenabled and an update is available, schedule it on next boot\n(update_on_boot); otherwise just record the detected state (ok /\nupdate_available) so it is visible to the user.\n\nSigned-off-by: Stephen Cheng <stephen.cheng@citrix.com>",
          "is_bot": false,
          "headline": "always record VM secureboot_certificates_state at creation",
          "author_name": "Stephen Cheng",
          "author_login": null,
          "committed_at": "2026-07-06T09:10:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d862fade4fc75a8277cea3505adf6abab6a2bdcf",
          "body": "Signed-off-by: Stephen Cheng <stephen.cheng@citrix.com>",
          "is_bot": false,
          "headline": "change schema hash",
          "author_name": "Stephen Cheng",
          "author_login": null,
          "committed_at": "2026-07-06T09:10:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22bfccbdeb1750e485b273a5ee85a78222037474",
          "body": "1. Add a pool-level boolean Pool.auto_update_vm_secureboot_certificates\n(RW, default false).\n\nThis is the opt-in switch for automatically updating expiring Secure Boot\ncertificates on newly created VMs; it defaults to disabled so xapi never\nmodifies VM NVRAM unless the admin opts in.\n\n2. When the po\n[…]\niables (e.g. BIOS VMs), so no external check is run in that\ncase. The behaviour is gated on the pool opt-in, so default behaviour is\nunchanged.\n\nSigned-off-by: Stephen Cheng <stephen.cheng@citrix.com>",
          "is_bot": false,
          "headline": "auto-mark new VMs for Secure Boot certificate update on boot",
          "author_name": "Stephen Cheng",
          "author_login": null,
          "committed_at": "2026-07-06T09:10:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7c3b3ebd429f115271431501f983f5302992a29f",
          "body": "In `shutdown_agent`, the `xapi_pre_shutdown` may raise exception, then\nthe `light_fuse_and_dont_restart` is skipped. A DB data loss is found\nbecause db flush in that function is not executed.",
          "is_bot": false,
          "headline": "CA-428532: Ensure db flush is executed in shutdown_agent (#7164)",
          "author_name": "Changlei Li",
          "author_login": "changlei-li",
          "committed_at": "2026-07-06T08:12:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ad4e6bba40d24d4d292301fc4908fb86f0c47454",
          "body": "…7163)\n\nThis is a follow-up to https://github.com/xapi-project/xen-api/pull/7156\n\nThis quicktest fails without the fix above, and passes with it.",
          "is_bot": false,
          "headline": "quicktest: Verify non-snapshotted VBDs are not leaked on VM.revert (#…",
          "author_name": "Andriy Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-07-06T07:57:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6bf6cf1bb97c770b04e49fc7b9428428401ece1",
          "body": "Signed-off-by: Changlei Li <changlei.li@citrix.com>",
          "is_bot": false,
          "headline": "Update lifecycle",
          "author_name": "Changlei Li",
          "author_login": "changlei-li",
          "committed_at": "2026-07-06T06:48:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "331227c1a4debd00eee3c9673c71ccaa6305f6eb",
          "body": "In `shutdown_agent`, the `xapi_pre_shutdown` may raise exception,\nthen the `light_fuse_and_dont_restart` is skipped. A DB data\nloss is found because db flush in that funtion is not executed.\n\nSigned-off-by: Changlei Li <changlei.li@citrix.com>",
          "is_bot": false,
          "headline": "CA-428532: Ensure db flush is executed in shutdown_agent",
          "author_name": "Changlei Li",
          "author_login": "changlei-li",
          "committed_at": "2026-07-06T06:48:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19c438684541bc5826fdc646334718f5f74dbcd6",
          "body": "This is a follow-up to https://github.com/xapi-project/xen-api/pull/7156\n\nThis quicktest fails without the fix above, and passes with it.\n\nSigned-off-by: Andrii Sultanov <andriy.sultanov@vates.tech>",
          "is_bot": false,
          "headline": "quicktest: Verify non-snapshotted VBDs are not leaked on VM.revert",
          "author_name": "Andrii Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-07-03T09:13:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b63bc07a7ee8e5b021d30341590c29220139b2e",
          "body": "…cted VMs\n\nWhen HA is enabled on the pool, host.evacuate refuses to plan the evacuation\nof any VM that is not HA-protected, that is, whose ha_restart_priority is not\n\"restart\". This is intentional: the HA planner only accounts for protected\nVMs, so unprotected ones are excluded from the evacuation p\n[…]\nefore evacuating). Behaviour is otherwise\nunchanged: the evacuation still fails for these VMs, it is just reported\ncorrectly.\n\nCloses #4323\n\nSigned-off-by: Olivier Lambert <olivier.lambert@vates.tech>",
          "is_bot": false,
          "headline": "xapi: report a clear error when host evacuation is blocked by unprote…",
          "author_name": "Olivier Lambert",
          "author_login": "olivierlambert",
          "committed_at": "2026-07-02T20:49:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2f29f5effe8f819ebf17d8dfe4f3e8bad12e1a8e",
          "body": "Revert xcp-networkd: dhclient cleanup (#7138) after regression spotted.",
          "is_bot": false,
          "headline": "Revert xcp-networkd: dhclient cleanup (#7138) (#7159)",
          "author_name": "Changlei Li",
          "author_login": "changlei-li",
          "committed_at": "2026-07-02T09:35:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fda4faf700395d09091c5fba83de8ae73aa17d2",
          "body": "… the interface if running and to unconfigure addresses.\"\n\nThis reverts commit 8109f32aa5c0ef499e4c92d7984a87874e65c75f.\n\nSigned-off-by: Sebastien Rodot <sebastien.rodot@vates.tech>",
          "is_bot": false,
          "headline": "Revert \"networkd: make Dhclient.stop to stop the DHCP client managing…",
          "author_name": "Sebastien Rodot",
          "author_login": "semarie",
          "committed_at": "2026-07-02T05:58:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b212573a8de18aba94ea44837f42b16a915e17a",
          "body": "…assigned addresses.\"\n\nThis reverts commit 0d3b9a6d324c61dda2b2414c72336c0160261601.\n\nSigned-off-by: Sebastien Rodot <sebastien.rodot@vates.tech>",
          "is_bot": false,
          "headline": "Revert \"networkd: make Dhclient.ensure_running to discard previously …",
          "author_name": "Sebastien Rodot",
          "author_login": "semarie",
          "committed_at": "2026-07-02T05:58:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7658162c78a69279e1c0cbb54222e663129bbfe3",
          "body": "This reverts commit 2ea48ef60d1ebe39d8e564215586e3145cb9d317.\n\nSigned-off-by: Sebastien Rodot <sebastien.rodot@vates.tech>",
          "is_bot": false,
          "headline": "Revert \"dhclient: add comments on functions\"",
          "author_name": "Sebastien Rodot",
          "author_login": "semarie",
          "committed_at": "2026-07-02T05:58:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1dfc571a44dab2b83ede0c7930fa8b4bd46dc58",
          "body": "This reverts commit 83e7241d4bfaccd10a684ac778a94974ca6efcb8.\n\nSigned-off-by: Sebastien Rodot <sebastien.rodot@vates.tech>",
          "is_bot": false,
          "headline": "Revert \"networkd: refactor set_ipv{4,6}_conf functions\"",
          "author_name": "Sebastien Rodot",
          "author_login": "semarie",
          "committed_at": "2026-07-02T05:58:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2a68366b9c534341323f0e04a5905bdd140d7a44",
          "body": "…public interface\"\n\nThis reverts commit 616b58c2a36ba9e9e3bd777351aafe7dbdbbca71.\n\nSigned-off-by: Sebastien Rodot <sebastien.rodot@vates.tech>",
          "is_bot": false,
          "headline": "Revert \"dhclient: add `set_stale` (and remove `remove_conf_file`) in …",
          "author_name": "Sebastien Rodot",
          "author_login": "semarie",
          "committed_at": "2026-07-02T05:58:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5bd7c8db538ffe3935eab2b5d52115707300927",
          "body": "…21.2 to 2.22.0 in /ocaml/sdk-gen/java/autogen/xen-api (#7153)\n\nBumps\n[com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson)\nfrom 2.21.2 to 2.22.0.\n<details>\n<summary>Commits</summary>\n<ul>\n<li>See full diff in <a\nhref=\"https://github.com/FasterXML/jackson/commits\">compa\n[…]\nu reopen the\nPR or upgrade to it yourself)\nYou can disable automated security fix PRs for this repo from the\n[Security Alerts\npage](https://github.com/xapi-project/xen-api/network/alerts).\n\n</details>",
          "is_bot": false,
          "headline": "build(deps): bump com.fasterxml.jackson.core:jackson-databind from 2.…",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-07-01T13:29:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d7e6fc220238de51c785df69c0941d43db3fd690",
          "body": "Disks without snapshot are left unattached after the revert is complete.\nThis is right but the vbds should be removed.\nFix\nhttps://github.com/xapi-project/xen-api/pull/7116#discussion_r3502974505",
          "is_bot": false,
          "headline": "CA-429144: Do not leak new vbds after snapshot (#7156)",
          "author_name": "Changlei Li",
          "author_login": "changlei-li",
          "committed_at": "2026-07-01T10:06:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a1d7145180df5250af005c06a9a8652b4ae7902",
          "body": "Disks without snapshot are left unattached after the revert\nis complete. This is right but the vbds should be removed.\n\nSigned-off-by: Changlei Li <changlei.li@citrix.com>",
          "is_bot": false,
          "headline": "CA-429144: Do not leak new vbds after snapshot",
          "author_name": "Changlei Li",
          "author_login": "changlei-li",
          "committed_at": "2026-07-01T03:08:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3bc7574b54fee31dd835be5ef0c531cc85ea4bab",
          "body": "Bumps [com.fasterxml.jackson.core:jackson-databind](https://github.com/FasterXML/jackson) from 2.21.2 to 2.22.0.\n- [Commits](https://github.com/FasterXML/jackson/commits)\n\n---\nupdated-dependencies:\n- dependency-name: com.fasterxml.jackson.core:jackson-databind\n  dependency-version: 2.22.0\n  dependency-type: direct:production\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "build(deps): bump com.fasterxml.jackson.core:jackson-databind",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-30T03:44:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6a72e44d661fff058db4871d5c7eacc2599c944",
          "body": "Test report:\n\nhttps://xenserver.atlassian.net/wiki/spaces/xenserver/pages/1208909838/Quality+Status+Report+for+Secure+LDAP+Support+XS9",
          "is_bot": false,
          "headline": "Merge feature branch to master (#7149)",
          "author_name": "Changlei Li",
          "author_login": "changlei-li",
          "committed_at": "2026-06-30T03:20:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9913e47b604b6625bcec11784da894c8dcb9254e",
          "body": "When the chosen HA cluster_stack is corosync (i.e. for a gfs2 heartbeat\nSR) every pool host must have an enabled, joined cluster_host on the\nmatching cluster stack, and this host must currently be quorate. Without\nthis preflight, that failure surfaces much later inside\nXha_statefile.check_sr_can_hos\n[…]\ntics directly rather than reading the Cluster_host.live DB field,\nwhich the corosync_notifyd watcher only updates asynchronously and which\nis reset to false for all hosts on any transient quorum blip.",
          "is_bot": false,
          "headline": "CA-403379: pre-flight cluster_host state before pool-ha-enable (#7130)",
          "author_name": "LunfanZhang",
          "author_login": "LunfanZhang",
          "committed_at": "2026-06-30T02:55:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fce34362161c50de32087b4ab00b153e59360b73",
          "body": null,
          "is_bot": false,
          "headline": "Update release version to 26.15.0-next (#7152)",
          "author_name": "Ming Lu",
          "author_login": "minglumlu",
          "committed_at": "2026-06-29T10:48:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfa60cc2a53a2650f0da898aa221bd2ad85464e3",
          "body": "…cates_from\n\npool.sync_trusted_certificates_from is a new message declared with an empty\n~lifecycle:[], so (like its sibling trusted-certificate messages) its\nprototyped version must be recorded in the generated\nocaml/idl/datamodel_lifecycle.ml. That entry was missing, leaving the\ngenerated file out\n[…]\n15.0-next).\n\nGenerated with: dune build @ocaml/idl/update-dm-lifecycle --auto-promote\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nSigned-off-by: Lin Liu <Lin.Liu01@cloud.com>",
          "is_bot": false,
          "headline": "CP-312131: regenerate datamodel_lifecycle.ml for sync_trusted_certifi…",
          "author_name": "Lin Liu",
          "author_login": "liulinC",
          "committed_at": "2026-06-29T09:57:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ccf0368b5b3b9c75a3568a51d6e7049912b9a3b3",
          "body": "external_auth_set_ldaps (host and pool) declared its ~lifecycle and\nparam_release versions as 26.12.0-next. The lifecycle auto-generation\ntool does not recognise -next versions, so the release must be set\nmanually to the current development version. Update all 8 occurrences\n(ocaml/idl/datamodel_host\n[…]\nool.ml: 4) from\n26.12.0-next to 26.15.0-next.\n\nAddresses review feedback on PR #7149.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nSigned-off-by: Lin Liu <Lin.Liu01@cloud.com>",
          "is_bot": false,
          "headline": "CP-312131: set LDAPS datamodel lifecycle version to 26.15.0-next",
          "author_name": "Lin Liu",
          "author_login": "liulinC",
          "committed_at": "2026-06-29T08:22:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "242f6db863994094c5b2cf9f0d1eeb5a29a080de",
          "body": "The field image_format added to receive_start and receive_start2 breaks\nmigration from old XAPI to new XAPI.\n\nBoth are sending RPC to the destination, which runs them locally. If the\ndestination has the field but not the source it breaks compatibility. On\nthe other hand, receive_start3 runs on the s\n[…]\nto choose the format of the destination when migrating from old version\nof XAPI to new version of XAPI. As receive_start and receive_start2 are\ndeprecated the situation will become more and more rare.",
          "is_bot": false,
          "headline": "Remove image format from deprecated receive start (#7144)",
          "author_name": "Changlei Li",
          "author_login": "changlei-li",
          "committed_at": "2026-06-29T08:09:10Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "67dad046ff8522cddc8feac41c934b246f5504e8",
          "body": null,
          "is_bot": false,
          "headline": "sync master to feature branch (#7148)",
          "author_name": "Lin Liu",
          "author_login": "liulinC",
          "committed_at": "2026-06-29T04:42:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5dacc6f9fdb644a39cbaf2957d0ff5726b537e8",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'master' into private/linl/sync",
          "author_name": "Lin Liu",
          "author_login": null,
          "committed_at": "2026-06-29T02:53:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71a2576b7aed6d9caf6b940ad5c13b142dab4eeb",
          "body": "The field image_format added to receive_start and receive_start2 breaks\nmigration from old XAPI to new XAPI.\n\nBoth are sending RPC to the destination, which runs them locally. If the\ndestination has the field but not the source it breaks compatibility. On the\nother hand, receive_start3 runs on the s\n[…]\non of XAPI to\nnew version of XAPI. As receive_start and receive_start2 are deprecated the\nsituation will become more and more rare.\n\nSigned-off-by: Guillaume Thouvenin <guillaume.thouvenin@vates.tech>",
          "is_bot": false,
          "headline": "Remove image format from deprecated receive start",
          "author_name": "Guillaume",
          "author_login": "gthvn1",
          "committed_at": "2026-06-26T15:40:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3e43f1ffe58816e29d3a3e6d8cb92f424c8180a1",
          "body": "Before:\n\n    $ xe vlan-create pif-uuid=<TAB>\n    3c1548f0-343f-b629-939a-e832512085f5  -\n    98d4cc1f-d97f-2126-7005-7c721e43c29f  -\n    93ba9954-b286-b984-9277-e62ec56f12c9  -\n\nAfter:\n\n    $ xe vlan-create pif-uuid=<TAB>\n    3c1548f0-343f-b629-939a-e832512085f5  - eth0\n    93ba9954-b286-b984-9277-e62ec56f12c9  - eth1\n    93dbac2c-b3e4-292f-ac35-1352b5ba9a75  - eth0",
          "is_bot": false,
          "headline": "xe: Fix bash completion for 'xe vlan-create pif-uuid=' (#7142)",
          "author_name": "Andriy Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-06-26T09:30:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "385fba2c4af94cd923741224ada07d57ffd47cc6",
          "body": "The following commits are a first step for doing some cleanup in DHCP\nclient.\n\nThe purpose is to abstract the module and clarify function contracts, in\norder to permit alternative DHCP client to current (unmaintained)\n`dhclient` binary from ISC.\n\nNo functional changes are expected, even if some operations are\nreordered.",
          "is_bot": false,
          "headline": "xcp-networkd: dhclient cleanup (#7138)",
          "author_name": "Andriy Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-06-25T13:39:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0fc1d1ba24a17f4389150789bb63e9b0ffa695d",
          "body": "Before:\n\n    $ xe vlan-create pif-uuid=<TAB>\n    3c1548f0-343f-b629-939a-e832512085f5  -\n    98d4cc1f-d97f-2126-7005-7c721e43c29f  -\n    93ba9954-b286-b984-9277-e62ec56f12c9  -\n\nAfter:\n\n    $ xe vlan-create pif-uuid=<TAB>\n    3c1548f0-343f-b629-939a-e832512085f5  - eth0\n    93ba9954-b286-b984-9277-e62ec56f12c9  - eth1\n    93dbac2c-b3e4-292f-ac35-1352b5ba9a75  - eth0\n\nSigned-off-by: Andrii Sultanov <andriy.sultanov@vates.tech>",
          "is_bot": false,
          "headline": "xe: Fix bash completion for 'xe vlan-create pif-uuid='",
          "author_name": "Andrii Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-06-25T13:22:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "616b58c2a36ba9e9e3bd777351aafe7dbdbbca71",
          "body": "…nterface\n\nIn `set_gateway_interface` and `set_dns_interface` we are removing the \nconfiguration file to trigger a restart of Dhclient on the next `ensure_running` \ncall.\n\nBy setting gateway or DNS interface, it affects the (possibly) running dhclient \nprocess and it will need restarting on the old \n[…]\non will be the same,\nbut a restart it still needed.\n\nBy marking the configuration as dirty, it ensures that the DHCP client will be restarted.\n\n\nSigned-off-by: Sebastien Marie <semarie@kapouay.eu.org>",
          "is_bot": false,
          "headline": "dhclient: add `set_stale` (and remove `remove_conf_file`) in public i…",
          "author_name": "Sebastien Marie",
          "author_login": "semarie",
          "committed_at": "2026-06-25T11:52:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "593360e0ab22c3db5b3d8085a3d12c8aa6a0d8db",
          "body": "The stunnel proxy process needs to be waited/reaped when 'use_daemon' is\nfalse. When it is false, vfork is used when a process creates stunnel\nprocesses. Hence the process is the parent of them. The process needs\nto wait for the stunnel processes after they are killed. Otherwise,\nthese stunnel processes would become zombie.\n\nThe value of 'use_daemon' is determined by the existence of file\n\"/etc/xensource/forkexec-uses-daemon\".",
          "is_bot": false,
          "headline": "CA-417915: stunnel proxy process is not reaped during stop (#7140)",
          "author_name": "Ming Lu",
          "author_login": "minglumlu",
          "committed_at": "2026-06-25T08:05:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79135d06eea6ee371817b809fb188503378b27c4",
          "body": "The stunnel proxy process needs to be waited/reaped when 'use_daemon' is\nfalse. When it is false, vfork is used when a process creates stunnel\nprocesses. Hence the process is the parent of them. The process needs\nto wait for the stunnel processes after they are killed. Otherwise,\nthese stunnel processes would become zombie.\n\nThe value of 'use_daemon' is determined by the existence of file\n\"/etc/xensource/forkexec-uses-daemon\".\n\nSigned-off-by: Ming Lu <ming.lu@cloud.com>",
          "is_bot": false,
          "headline": "CA-417915: stunnel proxy process is not reaped during stop",
          "author_name": "Ming Lu",
          "author_login": "minglumlu",
          "committed_at": "2026-06-25T07:46:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83e7241d4bfaccd10a684ac778a94974ca6efcb8",
          "body": "- deconfigure the previous configuration before configuring the new configuration\n  (instead of unconfiguring all possible configurations)\n- ignore exception in deconfiguration to ensure configuration is always called\n- if DHCP client needs restarting, do it with minimal disruption on the interface\n\nSigned-off-by: Sebastien Marie <semarie@kapouay.eu.org>",
          "is_bot": false,
          "headline": "networkd: refactor set_ipv{4,6}_conf functions",
          "author_name": "Sebastien Marie",
          "author_login": "semarie",
          "committed_at": "2026-06-24T09:09:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ea48ef60d1ebe39d8e564215586e3145cb9d317",
          "body": "Signed-off-by: Sebastien Marie <semarie@kapouay.eu.org>",
          "is_bot": false,
          "headline": "dhclient: add comments on functions",
          "author_name": "Sebastien Marie",
          "author_login": "semarie",
          "committed_at": "2026-06-24T09:06:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d3b9a6d324c61dda2b2414c72336c0160261601",
          "body": "… addresses.\n\nSigned-off-by: Sebastien Marie <semarie@kapouay.eu.org>",
          "is_bot": false,
          "headline": "networkd: make Dhclient.ensure_running to discard previously assigned…",
          "author_name": "Sebastien Marie",
          "author_login": "semarie",
          "committed_at": "2026-06-24T09:06:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8109f32aa5c0ef499e4c92d7984a87874e65c75f",
          "body": "…erface if running and to unconfigure addresses.\n\nSigned-off-by: Sebastien Marie <semarie@kapouay.eu.org>",
          "is_bot": false,
          "headline": "networkd: make Dhclient.stop to stop the DHCP client managing the int…",
          "author_name": "Sebastien Marie",
          "author_login": "semarie",
          "committed_at": "2026-06-24T09:06:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea81df80c0b96d8bbd6b50a9f404d3c3e14375fc",
          "body": "Signed-off-by: Sola.Zhang <Sola.Zhang@cloud.com>",
          "is_bot": false,
          "headline": "CP-310955: Update friendly error messages (#7108)",
          "author_name": "xueqingz",
          "author_login": "xueqingz",
          "committed_at": "2026-06-23T10:28:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74bdf429842caf4d5cf03ad4e325ff4c04ddb1bb",
          "body": null,
          "is_bot": false,
          "headline": "README: Add instructions for installing developer tools (#7136)",
          "author_name": "Andriy Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-06-23T08:58:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f6edc15bef006f27f2dfa0a18380c12756c809c",
          "body": "Signed-off-by: Andrii Sultanov <andriy.sultanov@vates.tech>",
          "is_bot": false,
          "headline": "README: Add instructions for installing developer tools",
          "author_name": "Andrii Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-06-22T09:59:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6ba38d7facb6106f9f7ed6a48ee91253d8075bb",
          "body": "The xenctrlext_stubs use libxenctrl symbols (e.g. xc_cpumap_alloc) but\ndid not declare it as a link dependency. So, the produced\ndllxenctrl_ext_stubs.so had no NEEDED entry for libxenctrl.\n\nWhen I try to run `dune utop` on my Debian Trixie the loading fails\nwith:\n  Fatal error: cannot load shared li\n[…]\n\n  Reason: .../ocaml/libs/xenctrl-ext/dllxenctrl_ext_stubs.so:\n          undefined symbol: xc_cpumap_alloc\n\nThis patch adds -lxenctrl to c_library_flags so the stubs declare the\ndependency themselves.",
          "is_bot": false,
          "headline": "xenctrl-ext: link stubs explicitly agains libxenctrl (#7135)",
          "author_name": "Andriy Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-06-19T11:47:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d869135530024ed462150242d51d11a766e0398",
          "body": "The xenctrlext_stubs use libxenctrl symbols (e.g. xc_cpumap_alloc)\nbut did not declare it as a link dependency. So, the produced\ndllxenctrl_ext_stubs.so had no NEEDED entry for libxenctrl.\n\nWhen I try to run `dune utop` on my Debian Trixie the loading fails\nwith:\n  Fatal error: cannot load shared li\n[…]\nso:\n          undefined symbol: xc_cpumap_alloc\n\nThis patch adds -lxenctrl to c_library_flags so the stubs declare the\ndependency themselves.\n\nSigned-off-by: Guillaume <guillaume.thouvenin@vates.tech>",
          "is_bot": false,
          "headline": "xenctrl-ext: link stubs explicitly agains libxenctrl",
          "author_name": "Guillaume",
          "author_login": "gthvn1",
          "committed_at": "2026-06-19T08:32:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "362b9921e9c9f8b0b9f07acb6ad50e4528fcb01b",
          "body": "This PR contains the changes needed to implement the proposal shown in\nhttps://github.com/xapi-project/xen-api/blob/master/doc/content/design/snapshot-revert.md\n\nPlease note that the storage backends need to implement VDI_REVERT in\norder to benefit from this change.\n\nThe fallback logic to the previo\n[…]\ne's one change in user-visible behaviour: now the UUID of the VDIs\ndo not change when reverting if VDI.revert is used.\n\nThis PR is a port to master of\nhttps://github.com/xapi-project/xen-api/pull/7116",
          "is_bot": false,
          "headline": "Implement Better VM revert using VDI revert (#7132)",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-18T13:14:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e68fa904dd2a725e5811951fa662defe2719eabc",
          "body": "When the chosen HA cluster_stack is corosync (i.e. for a gfs2 heartbeat\nSR) every pool host must have an enabled, joined cluster_host on the\nmatching cluster stack, and this host must currently be quorate.\nWithout this preflight, that failure surfaces much later inside\nXha_statefile.check_sr_can_hos\n[…]\nich the corosync_notifyd watcher only updates asynchronously\nand which is reset to false for all hosts on any transient quorum\nblip.\n\nSigned-off-by: Lunfan Zhang[Lunfan.Zhang] <Lunfan.Zhang@cloud.com>",
          "is_bot": false,
          "headline": "CA-403379: pre-flight cluster_host state before pool-ha-enable",
          "author_name": "Lunfan Zhang[Lunfan.Zhang]",
          "author_login": "LunfanZhang",
          "committed_at": "2026-06-18T06:38:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f32689258f5c5e86b26e5f3fd195dc453ed55ede",
          "body": "Because all the snapshot's CD VBDs are cloned in all cases, the reverted\nVM's CD VBDs must be destroyed in all cases, add them unconditionally to\nthe VBDs being destroyed.\n\nSigned-off-by: Pau Ruiz Safont <pau.safont@vates.tech>\n(cherry picked from commit 20e8b3bb5b44406560d08fa6d5c925b089bfa091)",
          "is_bot": false,
          "headline": "xapi_vm_snapshot: do not leak CD VBDs",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-17T15:30:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22d53790f263320082989faf598c32940904e915",
          "body": "This shows the current code leaks the VBDs\n\nSigned-off-by: Pau Ruiz Safont <pau.safont@vates.tech>\n(cherry picked from commit 38cfbc549040b68f85d50e963546864ac2606a40)",
          "is_bot": false,
          "headline": "quicktest: test for number of CD VBDs",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-17T15:30:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1480fbdd785619833235c612b99d5aaf64576f76",
          "body": "This needed a fix for the datamodel_lifecycle and the datamodel hash\n\nThe minor schema version does not need to be changed since it was\nalready bumped in the corresponding cherry-pick that bumped it. I\nelected to do that instead of keeping it the same.\n\nSigned-off-by: Pau Ruiz Safont <pau.safont@vates.tech>",
          "is_bot": false,
          "headline": "cherry-pick fixes from better VM revert",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-17T09:38:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c6eb2c4da6d20776d853723002e114ebe56c34a",
          "body": "In case where there's an error while reverting on the Storage Backend,\nthe state of the SR might become unstable, and a recovery using the\nclone method for reverting might introduce bigger issues. Instead stop\nthe revert immediately.\n\nThe cases where ignoring the errors is acceptable is when either \n[…]\nif the SR implements\nthe revert for only some of the formats it implements.\n\nSigned-off-by: Pau Ruiz Safont <pau.safont@vates.tech>\n(cherry picked from commit f887de1b17b39875d2c4301d654544d6247d9758)",
          "is_bot": false,
          "headline": "xapi_vm_snapshot: Fail VM.revert when a VDI.revert actually fails",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-17T09:38:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e66f92bd849721a3d25cfee438fc2a917092c23",
          "body": "Signed-off-by: Pau Ruiz Safont <pau.safont@vates.tech>\n(cherry picked from commit 97823b4f7c015872b108dd4b2ba79a0b68daeadb)",
          "is_bot": false,
          "headline": "datamodel_lifecycle: refresh",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-17T09:38:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e990679d6ccbd37063d03f7412cb656c90362c52",
          "body": "The code now tries to call VDI.revert on all the disk VDIs, and if that\nfails, it falls back to the original revert method that destroys VM\ndisks, clones snapshot disks and then fixes up metadata.\n\nThis means that the successfully reverted disks must be excluded from\nthe original method. This is don\n[…]\nnal method\nto the native one: now VDI UUIDs are not changed when reverting.\n\nSigned-off-by: Pau Ruiz Safont <pau.safont@vates.tech>\n(cherry picked from commit d1ae2a7dd9ad83dc49b79ee1987200eeb0f87d89)",
          "is_bot": false,
          "headline": "xapi_vm_snapshot: change VM.revert to use VDI.revert",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-17T09:38:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d24549a7743bb40339e2c3c8710f6b2ff6955608",
          "body": "The API function is needed to be able to forward it across the pool and\nto block other operations on the VDI while it's running.\n\nIt's unused for the time being.\n\nCo-authored-by: John Else <john.else@citrix.com>\nSigned-off-by: Pau Ruiz Safont <pau.safont@vates.tech>\n(cherry picked from commit 6c95e340f6501a1fd17b049fcb89eca25d601029)",
          "is_bot": false,
          "headline": "CA-143836: Add VDI.revert API call",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-17T09:38:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1e31cd0bffc975cb68d26e732ac1126e137e5c1e",
          "body": "This operation allows storage backends to implement VDI revert natively,\nas well as advertise it. The operation is unused by xapi for the time\nbeing.\n\nCo-authored-by: David Scott <dave.scott@eu.citrix.com>\nCo-authored-by: John Else <john.else@citrix.com>\nSigned-off-by: Pau Ruiz Safont <pau.safont@vates.tech>\n(cherry picked from commit c368ca80b45a72acfbd6841d8643bbe4a658c895)",
          "is_bot": false,
          "headline": "storage: add VDI.revert",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-17T09:38:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f487aefcd26d0e66ab2c1cf15a21b6fd41ca853a",
          "body": "This is for both the live VDI (revert_from) and the snapshot (revert_to)\n\nThese correspond to the VM operations `reverting` and `revert`,\nrespectively.\n\nOnly snapshots backed by an SR that allows clones are allowed to be\nreverted to. This is because SRs supporting revert is not enough to use\nvdi rev\n[…]\nerted to an attached leaf.\n\nCo-authored-by: John Else <john.else@citrix.com>\nSigned-off-by: Pau Ruiz Safont <pau.safont@vates.tech>\n(cherry picked from commit 639bc3d69d5dc5c937f191af2b8e64733a42dd1c)",
          "is_bot": false,
          "headline": "xapi_vdi: Introduce VDI operations needed for revert",
          "author_name": "John Else",
          "author_login": "johnelse",
          "committed_at": "2026-06-17T09:38:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2bb61f03388542d6c39944832a8eba1b98b35473",
          "body": "Signed-off-by: Pau Ruiz Safont <pau.safont@vates.tech>\n(cherry picked from commit 7f931c11c9ed4d7b0ba73fc9360e32cb653264c7)",
          "is_bot": false,
          "headline": "xapi_vm_snapshot: shorten length of comments",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-17T09:38:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff7657ddfb07c820b97f8d3ad78956d4092a2963",
          "body": "Chassis_id, system_name and system_description are shared by all NICs on\na host. Adding them into networkd interface so that they can be prepared\nby XAPI and pushed to networkd. Otherwise, it would be costly for\nnetworkd to query XAPI for each NIC.",
          "is_bot": false,
          "headline": "[design doc] Add shared LLDP data into networkd interface (#7120)",
          "author_name": "Ming Lu",
          "author_login": "minglumlu",
          "committed_at": "2026-06-17T02:22:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1a4b39fe08a3e76bc2b21e1f691c81b77f9995f8",
          "body": "Fold Wbinfo.kdc_of_domain (wbinfo --getdcname) into the same match as\nLdap.query_user in query_subject_information_user, so a DC-location or\nLDAP query failure falls back to default_account instead of aborting\nsubject creation via let*. Fixes subject-add for one-way trusted-domain\nusers when getdcname cannot locate the trusted DC; attributes are\nrefreshed later by update_all_subjects.",
          "is_bot": false,
          "headline": "CA-428461: make trusted-domain attribute enrichment best-effort (#7126)",
          "author_name": "Lin Liu",
          "author_login": "liulinC",
          "committed_at": "2026-06-15T05:26:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c731400433c41bec7926a49137bc4b3d553dd740",
          "body": null,
          "is_bot": false,
          "headline": "Update datamodel_lifecycle for supported_image_formats (#7125)",
          "author_name": "Andriy Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-06-12T07:39:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d57c84d2e1ebf8ac8d15b4223ee39615d8c5c85e",
          "body": "Fold Wbinfo.kdc_of_domain (wbinfo --getdcname) into the same match as\nLdap.query_user in query_subject_information_user, so a DC-location or\nLDAP query failure falls back to default_account instead of aborting\nsubject creation via let*. Fixes subject-add for one-way trusted-domain\nusers when getdcna\n[…]\n cannot locate the trusted DC; attributes are\nrefreshed later by update_all_subjects.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nSigned-off-by: Lin Liu <Lin.Liu01@cloud.com>",
          "is_bot": false,
          "headline": "CA-428461: make trusted-domain attribute enrichment best-effort",
          "author_name": "Lin Liu",
          "author_login": "liulinC",
          "committed_at": "2026-06-12T06:35:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c4886eb9dacbd78a456a5abbf89ba5841852c0eb",
          "body": null,
          "is_bot": false,
          "headline": "Sync master to feature branch (#7128)",
          "author_name": "Lin Liu",
          "author_login": "liulinC",
          "committed_at": "2026-06-12T06:33:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45b356fffac685ffc389db3deccbcffbb9f6f6ff",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'master' into private/linl/sync",
          "author_name": "Lin Liu",
          "author_login": "liulinC",
          "committed_at": "2026-06-12T06:18:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb2e37c9812c45af3476a7363b7eb4132b50ef2c",
          "body": "When LDAPS is enabled, pool.enable_external_auth could intermittently\nfail with POOL_AUTH_ENABLE_FAILED_SETUP_TLS_CONNECTION: \"net ads join\"\nauto-selects a domain controller via DsGetDcName without considering its\nTLS certificate, so if the chosen DC presents a certificate that does\nnot chain to a t\n[…]\nid takes optional ?duser/?dpass arguments: when both\nare given it authenticates via the USER/PASSWD environment variables\ninstead of --machine-pass.\n\nWhen ldaps is disabled the behaviour is unchanged.",
          "is_bot": false,
          "headline": "CA-428436: validate DC LDAPS certificate before joining domain (#7121)",
          "author_name": "Lin Liu",
          "author_login": "liulinC",
          "committed_at": "2026-06-12T03:07:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b517e68425b3c139cd0bae3cb985f518abdf9d94",
          "body": "Signed-off-by: Guillaume Thouvenin <guillaume.thouvenin@vates.tech>",
          "is_bot": false,
          "headline": "Update datamodel_lifecycle for supported_image_formats",
          "author_name": "Guillaume Thouvenin",
          "author_login": "gthvn1",
          "committed_at": "2026-06-11T15:09:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f6406f5d217e11c8fc5a482ad6313d9eac8210f",
          "body": "This is a forward-port of\nhttps://github.com/xapi-project/xen-api/pull/6895 (with the exception of\ncommits later reverted in\nhttps://github.com/xapi-project/xen-api/pull/7030 and\nhttps://github.com/xapi-project/xen-api/pull/7022).\n\nChanges to VHD code are gated behind a feature flag (with previous\nb\n[…]\nt). XCP-ng has been running the new VHD and QCOW\ncode for a while now with no issues.\n\nThis PR needs to be merged before the corresponding xs-opam PR\n(https://github.com/xapi-project/xs-opam/pull/768)",
          "is_bot": false,
          "headline": "[master] Optimize data cluster format for VHD and QCOW (#7106)",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-11T10:30:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "457e48a64fceced465ad3da08988c56469e00f30",
          "body": "These changes add both unit-tests and quicktests to make sure that\nregressions introduced with VDI.revert will be visible as early as\npossible.\n\nIn particular:\n- unit tests have been added to make sure adding the VDI_REVERT SR\noperation doesn't break important internal properties.\n- quicktests have \n[…]\n conflicting in a dune file, which had an easy resolution to\ntake both into account\n- One function in the quicktests changed, and needed a change in the new\ntests, which was added as a separate commit",
          "is_bot": false,
          "headline": "Prepare for VDI.revert: add tests and robustify error paths (#7104)",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-11T08:31:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b7d853b25141840738dce4de6e69cfde79bf1949",
          "body": "Chassis_id, system_name and system_description are shared by all NICs on\na host. Adding them into networkd interface so that they can be prepared\nby XAPI and pushed to networkd. Otherwise, it would be costly for\nnetworkd to query XAPI for each NIC.\n\nSigned-off-by: Ming Lu <ming.lu@cloud.com>",
          "is_bot": false,
          "headline": "[design doc] Add shared LLDP data into networkd interface",
          "author_name": "Ming Lu",
          "author_login": "minglumlu",
          "committed_at": "2026-06-10T09:48:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "788869e5a92e10332ba2428eb91e5a2caf4c7131",
          "body": "XAPI exposes a `VIF.configure_ipv4/v6` message to instruct guest agents\nto configure the VM's IP settings on the host's behalf.\n\nThis feature currently works by setting\n`/local/domain/<domid>/xenserver/device/vif/<N>/static-ip-setting/enabled`\nto one of the following values:\n\n- `enabled=0`: None (un\n[…]\n3821f1c95a5ed46efdf59bf4/src/xenguestlib/FeatureStaticIpSetting.cs#L534)\nsince a very long time, and from my testing with the XS 9.6.0 guest\nagent, is capable of reverting to DHCP if enabled=2 is set.",
          "is_bot": false,
          "headline": "Add DHCP setting for VIF IP configuration (#7118)",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-10T08:09:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d045710cbe934c49c7021db6d021c32637384b00",
          "body": "XAPI exposes a VIF.configure_ipv4/v6 message to instruct guest agents to\nconfigure the VM's IP settings on the host's behalf.\n\nThis feature currently works by setting /local/domain/<domid>/xenserver/\ndevice/vif/<N>/static-ip-setting/enabled to one of the following values:\n\nenabled=0: None (unconfigu\n[…]\n2. This mode\ninstructs the guest to configure its VIF to use DHCP (on IPv4) or any\nappropriate method to obtain an IP address automatically (on IPv6).\n\nSigned-off-by: Tu Dinh <ngoc-tu.dinh@vates.tech>",
          "is_bot": false,
          "headline": "Add DHCP setting for VIF IP configuration",
          "author_name": "Tu Dinh",
          "author_login": "dinhngtu",
          "committed_at": "2026-06-09T15:03:21Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fb6925055aba91ceb8c035824f693fd459619c1e",
          "body": "When LDAPS is enabled, pool.enable_external_auth could intermittently\nfail with POOL_AUTH_ENABLE_FAILED_SETUP_TLS_CONNECTION: \"net ads join\"\nauto-selects a domain controller via DsGetDcName without considering its\nTLS certificate, so if the chosen DC presents a certificate that does not\nchain to a t\n[…]\nables instead\nof --machine-pass.\n\nWhen ldaps is disabled the behaviour is unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\nSigned-off-by: Lin Liu <lin.liu01@citrix.com>",
          "is_bot": false,
          "headline": "CA-428436: validate DC LDAPS certificate before joining domain",
          "author_name": "Lin Liu",
          "author_login": null,
          "committed_at": "2026-06-09T09:35:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f2c5d557b47e525b91fd7fdc43f66fe3305905de",
          "body": null,
          "is_bot": false,
          "headline": "Update examples (#7117)",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-08T13:09:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "132059b4a5d71129179713f2570d33798e072a39",
          "body": null,
          "is_bot": false,
          "headline": "Enhancements to the XAPI documentation (#7100)",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-08T12:54:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4db1de694e7a0f77c080963f6b3dcf36b528f11c",
          "body": "Looks like this mechanism was used in the past, and only one vestigial\ncheck on VBD creation was used.\n\nIt does not make sense to create a VBD associated with a task and\nimmediately check whether it has leaked.",
          "is_bot": false,
          "headline": "xapi/attach_helpers: remove useless check for leaked vbds  (#7035)",
          "author_name": "Pau Ruiz Safont",
          "author_login": "psafont",
          "committed_at": "2026-06-08T12:40:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3edd2a2c33d734b1443229777e80edb2899fc540",
          "body": "It is currently possible to accidentally pass through a PCI device\nbacking the boot drive, making the system unbootable and requiring\nmanual intervention (since dom0 will no longer be able to access the PCI\ndevice).\n\nFix this at least for the drive behind '/', refusing to pass through its\nPCI device\n[…]\ndisable-dom0-access uuid=$UUID\n    Passing through a PCI device backing a boot disk is disallowed\n    device: /dev/sda1\n    $ /opt/xensource/libexec/xen-cmdline --get-dom0 xen-pciback.hide\n    <empty>",
          "is_bot": false,
          "headline": "xapi_pci: Disallow passthrough for boot devices (#7113)",
          "author_name": "Andriy Sultanov",
          "author_login": "last-genius",
          "committed_at": "2026-06-08T12:33:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2501b2868be1d11319184e04450e99bc585a253b",
          "body": null,
          "is_bot": false,
          "headline": "[design doc] LLDP support (#7105)",
          "author_name": "Ming Lu",
          "author_login": "minglumlu",
          "committed_at": "2026-06-08T10:50:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 100,
      "commits_last_year": 1185,
      "latest_release_at": "2026-07-21T03:04:19Z",
      "latest_release_tag": "v26.1.17",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 52,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 7
    },
    "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": 302,
      "stars": 365,
      "watchers": 51,
      "fork_history": {
        "days": [
          {
            "date": "2010-12-16",
            "count": 1
          },
          {
            "date": "2011-01-06",
            "count": 1
          },
          {
            "date": "2011-02-01",
            "count": 2
          },
          {
            "date": "2011-02-03",
            "count": 2
          },
          {
            "date": "2011-02-08",
            "count": 1
          },
          {
            "date": "2011-02-11",
            "count": 1
          },
          {
            "date": "2011-02-16",
            "count": 1
          },
          {
            "date": "2011-02-17",
            "count": 1
          },
          {
            "date": "2011-03-07",
            "count": 2
          },
          {
            "date": "2011-03-28",
            "count": 2
          },
          {
            "date": "2011-03-29",
            "count": 1
          },
          {
            "date": "2011-04-03",
            "count": 1
          },
          {
            "date": "2011-04-07",
            "count": 1
          },
          {
            "date": "2011-04-11",
            "count": 1
          },
          {
            "date": "2011-06-01",
            "count": 1
          },
          {
            "date": "2011-08-08",
            "count": 1
          },
          {
            "date": "2011-08-09",
            "count": 1
          },
          {
            "date": "2011-10-27",
            "count": 1
          },
          {
            "date": "2011-11-03",
            "count": 1
          },
          {
            "date": "2012-01-09",
            "count": 1
          },
          {
            "date": "2012-03-07",
            "count": 1
          },
          {
            "date": "2012-06-06",
            "count": 1
          },
          {
            "date": "2012-07-05",
            "count": 1
          },
          {
            "date": "2012-07-25",
            "count": 1
          },
          {
            "date": "2012-08-15",
            "count": 2
          },
          {
            "date": "2012-09-08",
            "count": 1
          },
          {
            "date": "2012-10-26",
            "count": 1
          },
          {
            "date": "2012-11-21",
            "count": 1
          },
          {
            "date": "2012-12-01",
            "count": 1
          },
          {
            "date": "2012-12-07",
            "count": 1
          },
          {
            "date": "2012-12-17",
            "count": 1
          },
          {
            "date": "2012-12-18",
            "count": 1
          },
          {
            "date": "2012-12-22",
            "count": 1
          },
          {
            "date": "2013-01-03",
            "count": 1
          },
          {
            "date": "2013-01-09",
            "count": 1
          },
          {
            "date": "2013-01-27",
            "count": 1
          },
          {
            "date": "2013-02-11",
            "count": 1
          },
          {
            "date": "2013-02-13",
            "count": 1
          },
          {
            "date": "2013-02-26",
            "count": 1
          },
          {
            "date": "2013-03-01",
            "count": 2
          },
          {
            "date": "2013-03-21",
            "count": 1
          },
          {
            "date": "2013-04-29",
            "count": 1
          },
          {
            "date": "2013-04-30",
            "count": 1
          },
          {
            "date": "2013-06-08",
            "count": 1
          },
          {
            "date": "2013-06-10",
            "count": 1
          },
          {
            "date": "2013-06-28",
            "count": 1
          },
          {
            "date": "2013-07-20",
            "count": 1
          },
          {
            "date": "2013-07-26",
            "count": 1
          },
          {
            "date": "2013-08-16",
            "count": 1
          },
          {
            "date": "2013-09-08",
            "count": 1
          },
          {
            "date": "2013-10-09",
            "count": 1
          },
          {
            "date": "2013-10-18",
            "count": 1
          },
          {
            "date": "2013-10-25",
            "count": 1
          },
          {
            "date": "2013-10-28",
            "count": 1
          },
          {
            "date": "2013-10-31",
            "count": 2
          },
          {
            "date": "2013-11-02",
            "count": 1
          },
          {
            "date": "2013-11-05",
            "count": 3
          },
          {
            "date": "2013-11-14",
            "count": 1
          },
          {
            "date": "2013-12-16",
            "count": 1
          },
          {
            "date": "2013-12-27",
            "count": 1
          },
          {
            "date": "2014-01-15",
            "count": 2
          },
          {
            "date": "2014-01-16",
            "count": 1
          },
          {
            "date": "2014-02-13",
            "count": 1
          },
          {
            "date": "2014-03-03",
            "count": 1
          },
          {
            "date": "2014-03-17",
            "count": 1
          },
          {
            "date": "2014-04-10",
            "count": 1
          },
          {
            "date": "2014-04-15",
            "count": 1
          },
          {
            "date": "2014-04-21",
            "count": 1
          },
          {
            "date": "2014-05-29",
            "count": 1
          },
          {
            "date": "2014-05-31",
            "count": 1
          },
          {
            "date": "2014-06-10",
            "count": 1
          },
          {
            "date": "2014-06-12",
            "count": 1
          },
          {
            "date": "2014-06-25",
            "count": 1
          },
          {
            "date": "2014-07-15",
            "count": 1
          },
          {
            "date": "2014-07-23",
            "count": 1
          },
          {
            "date": "2014-07-29",
            "count": 1
          },
          {
            "date": "2014-08-08",
            "count": 1
          },
          {
            "date": "2014-08-13",
            "count": 1
          },
          {
            "date": "2014-09-18",
            "count": 2
          },
          {
            "date": "2014-09-19",
            "count": 1
          },
          {
            "date": "2014-10-06",
            "count": 1
          },
          {
            "date": "2014-10-08",
            "count": 1
          },
          {
            "date": "2014-11-19",
            "count": 1
          },
          {
            "date": "2014-12-16",
            "count": 1
          },
          {
            "date": "2015-01-14",
            "count": 1
          },
          {
            "date": "2015-02-25",
            "count": 1
          },
          {
            "date": "2015-03-04",
            "count": 1
          },
          {
            "date": "2015-03-20",
            "count": 1
          },
          {
            "date": "2015-03-28",
            "count": 1
          },
          {
            "date": "2015-06-10",
            "count": 1
          },
          {
            "date": "2015-06-18",
            "count": 1
          },
          {
            "date": "2015-09-05",
            "count": 1
          },
          {
            "date": "2015-09-08",
            "count": 1
          },
          {
            "date": "2015-09-15",
            "count": 1
          },
          {
            "date": "2015-09-16",
            "count": 1
          },
          {
            "date": "2015-09-30",
            "count": 1
          },
          {
            "date": "2015-10-20",
            "count": 1
          },
          {
            "date": "2016-02-10",
            "count": 1
          },
          {
            "date": "2016-02-19",
            "count": 2
          },
          {
            "date": "2016-04-04",
            "count": 1
          },
          {
            "date": "2016-05-01",
            "count": 1
          },
          {
            "date": "2016-06-21",
            "count": 2
          },
          {
            "date": "2016-07-18",
            "count": 1
          },
          {
            "date": "2016-07-27",
            "count": 1
          },
          {
            "date": "2016-08-08",
            "count": 1
          },
          {
            "date": "2016-08-09",
            "count": 1
          },
          {
            "date": "2016-08-23",
            "count": 1
          },
          {
            "date": "2016-08-30",
            "count": 1
          },
          {
            "date": "2016-09-29",
            "count": 1
          },
          {
            "date": "2017-01-05",
            "count": 1
          },
          {
            "date": "2017-01-06",
            "count": 1
          },
          {
            "date": "2017-01-15",
            "count": 1
          },
          {
            "date": "2017-01-31",
            "count": 1
          },
          {
            "date": "2017-02-03",
            "count": 1
          },
          {
            "date": "2017-02-09",
            "count": 1
          },
          {
            "date": "2017-02-23",
            "count": 1
          },
          {
            "date": "2017-03-07",
            "count": 1
          },
          {
            "date": "2017-03-15",
            "count": 1
          },
          {
            "date": "2017-03-25",
            "count": 1
          },
          {
            "date": "2017-04-03",
            "count": 1
          },
          {
            "date": "2017-04-07",
            "count": 1
          },
          {
            "date": "2017-04-20",
            "count": 2
          },
          {
            "date": "2017-04-21",
            "count": 1
          },
          {
            "date": "2017-04-28",
            "count": 1
          },
          {
            "date": "2017-05-04",
            "count": 1
          },
          {
            "date": "2017-05-10",
            "count": 1
          },
          {
            "date": "2017-05-15",
            "count": 1
          },
          {
            "date": "2017-06-09",
            "count": 1
          },
          {
            "date": "2017-06-27",
            "count": 1
          },
          {
            "date": "2017-08-03",
            "count": 1
          },
          {
            "date": "2017-08-07",
            "count": 1
          },
          {
            "date": "2017-08-12",
            "count": 1
          },
          {
            "date": "2017-08-16",
            "count": 1
          },
          {
            "date": "2017-08-21",
            "count": 1
          },
          {
            "date": "2017-09-01",
            "count": 1
          },
          {
            "date": "2017-09-20",
            "count": 1
          },
          {
            "date": "2017-11-07",
            "count": 1
          },
          {
            "date": "2017-11-08",
            "count": 1
          },
          {
            "date": "2017-11-13",
            "count": 1
          },
          {
            "date": "2017-11-14",
            "count": 1
          },
          {
            "date": "2017-11-17",
            "count": 1
          },
          {
            "date": "2017-12-27",
            "count": 1
          },
          {
            "date": "2018-01-07",
            "count": 1
          },
          {
            "date": "2018-01-24",
            "count": 1
          },
          {
            "date": "2018-02-02",
            "count": 1
          },
          {
            "date": "2018-02-07",
            "count": 1
          },
          {
            "date": "2018-02-11",
            "count": 1
          },
          {
            "date": "2018-02-23",
            "count": 1
          },
          {
            "date": "2018-03-19",
            "count": 1
          },
          {
            "date": "2018-04-12",
            "count": 1
          },
          {
            "date": "2018-04-30",
            "count": 1
          },
          {
            "date": "2018-05-25",
            "count": 1
          },
          {
            "date": "2018-06-01",
            "count": 1
          },
          {
            "date": "2018-07-26",
            "count": 1
          },
          {
            "date": "2018-09-13",
            "count": 1
          },
          {
            "date": "2018-10-09",
            "count": 1
          },
          {
            "date": "2018-10-22",
            "count": 2
          },
          {
            "date": "2018-11-28",
            "count": 1
          },
          {
            "date": "2018-12-03",
            "count": 1
          },
          {
            "date": "2018-12-11",
            "count": 1
          },
          {
            "date": "2018-12-17",
            "count": 1
          },
          {
            "date": "2019-01-07",
            "count": 1
          },
          {
            "date": "2019-01-11",
            "count": 1
          },
          {
            "date": "2019-01-16",
            "count": 1
          },
          {
            "date": "2019-01-22",
            "count": 1
          },
          {
            "date": "2019-01-29",
            "count": 1
          },
          {
            "date": "2019-02-16",
            "count": 1
          },
          {
            "date": "2019-02-27",
            "count": 1
          },
          {
            "date": "2019-04-11",
            "count": 1
          },
          {
            "date": "2019-04-12",
            "count": 1
          },
          {
            "date": "2019-04-29",
            "count": 1
          },
          {
            "date": "2019-05-28",
            "count": 1
          },
          {
            "date": "2019-06-26",
            "count": 1
          },
          {
            "date": "2019-07-03",
            "count": 1
          },
          {
            "date": "2019-07-04",
            "count": 1
          },
          {
            "date": "2019-07-17",
            "count": 1
          },
          {
            "date": "2019-08-27",
            "count": 1
          },
          {
            "date": "2019-09-10",
            "count": 1
          },
          {
            "date": "2019-10-18",
            "count": 1
          },
          {
            "date": "2019-10-22",
            "count": 1
          },
          {
            "date": "2019-10-24",
            "count": 1
          },
          {
            "date": "2019-10-25",
            "count": 1
          },
          {
            "date": "2019-11-18",
            "count": 1
          },
          {
            "date": "2019-11-27",
            "count": 1
          },
          {
            "date": "2019-12-06",
            "count": 1
          },
          {
            "date": "2020-01-17",
            "count": 1
          },
          {
            "date": "2020-01-29",
            "count": 1
          },
          {
            "date": "2020-03-24",
            "count": 1
          },
          {
            "date": "2020-04-11",
            "count": 1
          },
          {
            "date": "2020-04-13",
            "count": 1
          },
          {
            "date": "2020-04-17",
            "count": 1
          },
          {
            "date": "2020-05-29",
            "count": 1
          },
          {
            "date": "2020-06-22",
            "count": 1
          },
          {
            "date": "2020-07-29",
            "count": 1
          },
          {
            "date": "2020-11-24",
            "count": 1
          },
          {
            "date": "2021-01-11",
            "count": 1
          },
          {
            "date": "2021-01-19",
            "count": 1
          },
          {
            "date": "2021-03-20",
            "count": 1
          },
          {
            "date": "2021-03-30",
            "count": 1
          },
          {
            "date": "2021-04-07",
            "count": 1
          },
          {
            "date": "2021-04-15",
            "count": 1
          },
          {
            "date": "2021-05-01",
            "count": 1
          },
          {
            "date": "2021-05-08",
            "count": 1
          },
          {
            "date": "2021-08-06",
            "count": 1
          },
          {
            "date": "2021-08-09",
            "count": 1
          },
          {
            "date": "2021-08-11",
            "count": 1
          },
          {
            "date": "2021-11-30",
            "count": 1
          },
          {
            "date": "2021-12-06",
            "count": 1
          },
          {
            "date": "2022-03-24",
            "count": 1
          },
          {
            "date": "2022-04-09",
            "count": 1
          },
          {
            "date": "2022-08-31",
            "count": 1
          },
          {
            "date": "2022-09-09",
            "count": 1
          },
          {
            "date": "2022-09-15",
            "count": 1
          },
          {
            "date": "2022-10-17",
            "count": 1
          },
          {
            "date": "2022-11-02",
            "count": 1
          },
          {
            "date": "2022-11-22",
            "count": 1
          },
          {
            "date": "2022-12-06",
            "count": 1
          },
          {
            "date": "2022-12-09",
            "count": 1
          },
          {
            "date": "2023-02-10",
            "count": 1
          },
          {
            "date": "2023-02-16",
            "count": 1
          },
          {
            "date": "2023-03-02",
            "count": 1
          },
          {
            "date": "2023-04-20",
            "count": 1
          },
          {
            "date": "2023-06-04",
            "count": 1
          },
          {
            "date": "2023-07-10",
            "count": 1
          },
          {
            "date": "2023-07-14",
            "count": 1
          },
          {
            "date": "2023-08-02",
            "count": 1
          },
          {
            "date": "2023-08-06",
            "count": 1
          },
          {
            "date": "2023-08-21",
            "count": 1
          },
          {
            "date": "2023-08-30",
            "count": 1
          },
          {
            "date": "2023-09-01",
            "count": 1
          },
          {
            "date": "2023-09-19",
            "count": 1
          },
          {
            "date": "2023-10-03",
            "count": 1
          },
          {
            "date": "2023-11-06",
            "count": 1
          },
          {
            "date": "2023-11-15",
            "count": 1
          },
          {
            "date": "2023-11-16",
            "count": 2
          },
          {
            "date": "2024-01-16",
            "count": 1
          },
          {
            "date": "2024-02-12",
            "count": 1
          },
          {
            "date": "2024-02-21",
            "count": 1
          },
          {
            "date": "2024-03-07",
            "count": 1
          },
          {
            "date": "2024-03-15",
            "count": 1
          },
          {
            "date": "2024-04-18",
            "count": 1
          },
          {
            "date": "2024-05-16",
            "count": 1
          },
          {
            "date": "2024-05-17",
            "count": 1
          },
          {
            "date": "2024-05-28",
            "count": 1
          },
          {
            "date": "2024-06-21",
            "count": 1
          },
          {
            "date": "2024-06-28",
            "count": 1
          },
          {
            "date": "2024-07-19",
            "count": 1
          },
          {
            "date": "2024-10-08",
            "count": 1
          },
          {
            "date": "2024-10-21",
            "count": 1
          },
          {
            "date": "2024-11-08",
            "count": 1
          },
          {
            "date": "2025-02-06",
            "count": 1
          },
          {
            "date": "2025-02-09",
            "count": 1
          },
          {
            "date": "2025-04-30",
            "count": 1
          },
          {
            "date": "2025-05-30",
            "count": 1
          },
          {
            "date": "2025-09-15",
            "count": 1
          },
          {
            "date": "2025-10-27",
            "count": 1
          },
          {
            "date": "2025-11-27",
            "count": 1
          },
          {
            "date": "2025-12-03",
            "count": 1
          },
          {
            "date": "2025-12-10",
            "count": 1
          },
          {
            "date": "2025-12-11",
            "count": 1
          },
          {
            "date": "2026-01-27",
            "count": 1
          },
          {
            "date": "2026-03-20",
            "count": 1
          },
          {
            "date": "2026-05-09",
            "count": 1
          },
          {
            "date": "2026-05-12",
            "count": 1
          },
          {
            "date": "2026-05-13",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 1
          },
          {
            "date": "2026-06-03",
            "count": 1
          },
          {
            "date": "2026-06-28",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 284,
        "total_forks": 302
      },
      "star_history": {
        "days": [
          {
            "date": "2010-10-04",
            "count": 37
          },
          {
            "date": "2010-10-07",
            "count": 1
          },
          {
            "date": "2010-10-13",
            "count": 1
          },
          {
            "date": "2010-10-24",
            "count": 1
          },
          {
            "date": "2010-11-06",
            "count": 1
          },
          {
            "date": "2010-12-20",
            "count": 1
          },
          {
            "date": "2011-01-27",
            "count": 1
          },
          {
            "date": "2011-01-29",
            "count": 1
          },
          {
            "date": "2011-02-07",
            "count": 2
          },
          {
            "date": "2011-02-11",
            "count": 1
          },
          {
            "date": "2011-02-17",
            "count": 1
          },
          {
            "date": "2011-02-22",
            "count": 2
          },
          {
            "date": "2011-03-05",
            "count": 1
          },
          {
            "date": "2011-03-07",
            "count": 2
          },
          {
            "date": "2011-03-28",
            "count": 1
          },
          {
            "date": "2011-03-29",
            "count": 1
          },
          {
            "date": "2011-04-02",
            "count": 1
          },
          {
            "date": "2011-04-06",
            "count": 1
          },
          {
            "date": "2011-05-27",
            "count": 1
          },
          {
            "date": "2011-06-01",
            "count": 1
          },
          {
            "date": "2011-06-03",
            "count": 1
          },
          {
            "date": "2011-06-13",
            "count": 1
          },
          {
            "date": "2011-06-26",
            "count": 1
          },
          {
            "date": "2011-08-09",
            "count": 1
          },
          {
            "date": "2011-11-19",
            "count": 1
          },
          {
            "date": "2011-11-27",
            "count": 1
          },
          {
            "date": "2011-12-07",
            "count": 1
          },
          {
            "date": "2011-12-08",
            "count": 1
          },
          {
            "date": "2011-12-13",
            "count": 1
          },
          {
            "date": "2012-01-09",
            "count": 1
          },
          {
            "date": "2012-02-06",
            "count": 1
          },
          {
            "date": "2012-03-07",
            "count": 1
          },
          {
            "date": "2012-03-11",
            "count": 1
          },
          {
            "date": "2012-05-23",
            "count": 2
          },
          {
            "date": "2012-07-04",
            "count": 1
          },
          {
            "date": "2012-07-05",
            "count": 1
          },
          {
            "date": "2012-07-30",
            "count": 1
          },
          {
            "date": "2012-08-08",
            "count": 1
          },
          {
            "date": "2012-09-05",
            "count": 1
          },
          {
            "date": "2012-11-01",
            "count": 1
          },
          {
            "date": "2012-12-28",
            "count": 1
          },
          {
            "date": "2013-01-09",
            "count": 1
          },
          {
            "date": "2013-02-11",
            "count": 1
          },
          {
            "date": "2013-02-26",
            "count": 1
          },
          {
            "date": "2013-02-27",
            "count": 1
          },
          {
            "date": "2013-03-29",
            "count": 1
          },
          {
            "date": "2013-04-11",
            "count": 1
          },
          {
            "date": "2013-04-17",
            "count": 1
          },
          {
            "date": "2013-04-29",
            "count": 1
          },
          {
            "date": "2013-04-30",
            "count": 2
          },
          {
            "date": "2013-05-02",
            "count": 1
          },
          {
            "date": "2013-05-14",
            "count": 1
          },
          {
            "date": "2013-05-15",
            "count": 1
          },
          {
            "date": "2013-05-17",
            "count": 1
          },
          {
            "date": "2013-05-30",
            "count": 1
          },
          {
            "date": "2013-05-31",
            "count": 1
          },
          {
            "date": "2013-06-24",
            "count": 1
          },
          {
            "date": "2013-07-03",
            "count": 1
          },
          {
            "date": "2013-07-15",
            "count": 1
          },
          {
            "date": "2013-07-24",
            "count": 1
          },
          {
            "date": "2013-07-26",
            "count": 1
          },
          {
            "date": "2013-08-12",
            "count": 2
          },
          {
            "date": "2013-08-25",
            "count": 1
          },
          {
            "date": "2013-08-31",
            "count": 1
          },
          {
            "date": "2013-09-03",
            "count": 1
          },
          {
            "date": "2013-09-18",
            "count": 1
          },
          {
            "date": "2013-10-06",
            "count": 1
          },
          {
            "date": "2013-10-17",
            "count": 1
          },
          {
            "date": "2013-11-05",
            "count": 2
          },
          {
            "date": "2014-01-15",
            "count": 1
          },
          {
            "date": "2014-02-02",
            "count": 1
          },
          {
            "date": "2014-02-07",
            "count": 1
          },
          {
            "date": "2014-02-08",
            "count": 1
          },
          {
            "date": "2014-02-20",
            "count": 1
          },
          {
            "date": "2014-02-22",
            "count": 1
          },
          {
            "date": "2014-02-27",
            "count": 1
          },
          {
            "date": "2014-03-07",
            "count": 1
          },
          {
            "date": "2014-03-11",
            "count": 1
          },
          {
            "date": "2014-03-13",
            "count": 1
          },
          {
            "date": "2014-03-24",
            "count": 1
          },
          {
            "date": "2014-03-31",
            "count": 1
          },
          {
            "date": "2014-04-17",
            "count": 1
          },
          {
            "date": "2014-04-20",
            "count": 1
          },
          {
            "date": "2014-04-29",
            "count": 1
          },
          {
            "date": "2014-05-20",
            "count": 1
          },
          {
            "date": "2014-06-05",
            "count": 1
          },
          {
            "date": "2014-06-12",
            "count": 1
          },
          {
            "date": "2014-07-14",
            "count": 1
          },
          {
            "date": "2014-08-17",
            "count": 1
          },
          {
            "date": "2014-09-08",
            "count": 1
          },
          {
            "date": "2014-09-09",
            "count": 1
          },
          {
            "date": "2014-09-15",
            "count": 1
          },
          {
            "date": "2014-09-25",
            "count": 1
          },
          {
            "date": "2014-11-20",
            "count": 1
          },
          {
            "date": "2014-12-02",
            "count": 1
          },
          {
            "date": "2014-12-09",
            "count": 2
          },
          {
            "date": "2014-12-24",
            "count": 1
          },
          {
            "date": "2014-12-25",
            "count": 1
          },
          {
            "date": "2015-01-04",
            "count": 1
          },
          {
            "date": "2015-01-14",
            "count": 1
          },
          {
            "date": "2015-01-28",
            "count": 1
          },
          {
            "date": "2015-01-30",
            "count": 2
          },
          {
            "date": "2015-07-03",
            "count": 1
          },
          {
            "date": "2015-07-20",
            "count": 1
          },
          {
            "date": "2015-08-14",
            "count": 1
          },
          {
            "date": "2015-09-05",
            "count": 1
          },
          {
            "date": "2015-09-25",
            "count": 1
          },
          {
            "date": "2015-10-06",
            "count": 1
          },
          {
            "date": "2015-10-09",
            "count": 1
          },
          {
            "date": "2015-10-12",
            "count": 1
          },
          {
            "date": "2015-10-13",
            "count": 1
          },
          {
            "date": "2015-11-23",
            "count": 1
          },
          {
            "date": "2015-12-12",
            "count": 1
          },
          {
            "date": "2015-12-17",
            "count": 1
          },
          {
            "date": "2015-12-30",
            "count": 1
          },
          {
            "date": "2016-01-03",
            "count": 1
          },
          {
            "date": "2016-01-05",
            "count": 1
          },
          {
            "date": "2016-01-16",
            "count": 1
          },
          {
            "date": "2016-02-06",
            "count": 1
          },
          {
            "date": "2016-02-17",
            "count": 1
          },
          {
            "date": "2016-03-17",
            "count": 1
          },
          {
            "date": "2016-03-19",
            "count": 1
          },
          {
            "date": "2016-03-28",
            "count": 1
          },
          {
            "date": "2016-03-29",
            "count": 1
          },
          {
            "date": "2016-04-10",
            "count": 1
          },
          {
            "date": "2016-04-11",
            "count": 1
          },
          {
            "date": "2016-04-22",
            "count": 1
          },
          {
            "date": "2016-04-24",
            "count": 1
          },
          {
            "date": "2016-04-27",
            "count": 1
          },
          {
            "date": "2016-05-02",
            "count": 1
          },
          {
            "date": "2016-05-05",
            "count": 1
          },
          {
            "date": "2016-05-25",
            "count": 1
          },
          {
            "date": "2016-06-06",
            "count": 1
          },
          {
            "date": "2016-06-21",
            "count": 1
          },
          {
            "date": "2016-07-19",
            "count": 1
          },
          {
            "date": "2016-08-15",
            "count": 1
          },
          {
            "date": "2016-08-19",
            "count": 1
          },
          {
            "date": "2016-08-31",
            "count": 1
          },
          {
            "date": "2016-09-06",
            "count": 1
          },
          {
            "date": "2016-09-14",
            "count": 1
          },
          {
            "date": "2016-09-20",
            "count": 1
          },
          {
            "date": "2016-10-29",
            "count": 1
          },
          {
            "date": "2017-01-16",
            "count": 1
          },
          {
            "date": "2017-01-17",
            "count": 1
          },
          {
            "date": "2017-01-27",
            "count": 1
          },
          {
            "date": "2017-02-21",
            "count": 1
          },
          {
            "date": "2017-02-26",
            "count": 1
          },
          {
            "date": "2017-03-02",
            "count": 1
          },
          {
            "date": "2017-03-12",
            "count": 1
          },
          {
            "date": "2017-03-16",
            "count": 1
          },
          {
            "date": "2017-03-31",
            "count": 1
          },
          {
            "date": "2017-04-12",
            "count": 1
          },
          {
            "date": "2017-04-26",
            "count": 1
          },
          {
            "date": "2017-05-01",
            "count": 1
          },
          {
            "date": "2017-05-09",
            "count": 1
          },
          {
            "date": "2017-06-03",
            "count": 1
          },
          {
            "date": "2017-06-29",
            "count": 1
          },
          {
            "date": "2017-07-05",
            "count": 1
          },
          {
            "date": "2017-07-11",
            "count": 1
          },
          {
            "date": "2017-07-16",
            "count": 1
          },
          {
            "date": "2017-07-22",
            "count": 1
          },
          {
            "date": "2017-07-26",
            "count": 1
          },
          {
            "date": "2017-08-02",
            "count": 1
          },
          {
            "date": "2017-08-11",
            "count": 1
          },
          {
            "date": "2017-08-19",
            "count": 1
          },
          {
            "date": "2017-08-23",
            "count": 1
          },
          {
            "date": "2017-10-04",
            "count": 1
          },
          {
            "date": "2017-10-25",
            "count": 1
          },
          {
            "date": "2017-11-23",
            "count": 1
          },
          {
            "date": "2017-12-30",
            "count": 1
          },
          {
            "date": "2018-01-04",
            "count": 1
          },
          {
            "date": "2018-01-12",
            "count": 1
          },
          {
            "date": "2018-01-16",
            "count": 1
          },
          {
            "date": "2018-01-18",
            "count": 1
          },
          {
            "date": "2018-01-19",
            "count": 1
          },
          {
            "date": "2018-01-22",
            "count": 1
          },
          {
            "date": "2018-02-01",
            "count": 1
          },
          {
            "date": "2018-02-23",
            "count": 1
          },
          {
            "date": "2018-04-16",
            "count": 1
          },
          {
            "date": "2018-04-29",
            "count": 1
          },
          {
            "date": "2018-05-11",
            "count": 1
          },
          {
            "date": "2018-05-16",
            "count": 1
          },
          {
            "date": "2018-05-19",
            "count": 1
          },
          {
            "date": "2018-05-24",
            "count": 1
          },
          {
            "date": "2018-06-12",
            "count": 1
          },
          {
            "date": "2018-07-24",
            "count": 1
          },
          {
            "date": "2018-07-26",
            "count": 1
          },
          {
            "date": "2018-08-13",
            "count": 1
          },
          {
            "date": "2018-08-23",
            "count": 1
          },
          {
            "date": "2018-10-01",
            "count": 1
          },
          {
            "date": "2018-10-14",
            "count": 1
          },
          {
            "date": "2018-11-29",
            "count": 1
          },
          {
            "date": "2019-01-01",
            "count": 1
          },
          {
            "date": "2019-01-16",
            "count": 1
          },
          {
            "date": "2019-02-14",
            "count": 1
          },
          {
            "date": "2019-02-25",
            "count": 2
          },
          {
            "date": "2019-03-19",
            "count": 1
          },
          {
            "date": "2019-03-25",
            "count": 3
          },
          {
            "date": "2019-04-01",
            "count": 1
          },
          {
            "date": "2019-04-18",
            "count": 2
          },
          {
            "date": "2019-04-29",
            "count": 1
          },
          {
            "date": "2019-05-07",
            "count": 1
          },
          {
            "date": "2019-05-19",
            "count": 1
          },
          {
            "date": "2019-05-26",
            "count": 1
          },
          {
            "date": "2019-05-29",
            "count": 1
          },
          {
            "date": "2019-06-12",
            "count": 1
          },
          {
            "date": "2019-07-22",
            "count": 1
          },
          {
            "date": "2019-09-15",
            "count": 1
          },
          {
            "date": "2019-09-26",
            "count": 1
          },
          {
            "date": "2019-10-01",
            "count": 1
          },
          {
            "date": "2019-11-12",
            "count": 1
          },
          {
            "date": "2019-12-16",
            "count": 1
          },
          {
            "date": "2019-12-19",
            "count": 1
          },
          {
            "date": "2019-12-23",
            "count": 1
          },
          {
            "date": "2020-01-13",
            "count": 1
          },
          {
            "date": "2020-02-01",
            "count": 1
          },
          {
            "date": "2020-02-29",
            "count": 1
          },
          {
            "date": "2020-03-04",
            "count": 1
          },
          {
            "date": "2020-03-16",
            "count": 1
          },
          {
            "date": "2020-03-30",
            "count": 1
          },
          {
            "date": "2020-04-09",
            "count": 1
          },
          {
            "date": "2020-05-05",
            "count": 1
          },
          {
            "date": "2020-07-20",
            "count": 1
          },
          {
            "date": "2020-08-12",
            "count": 1
          },
          {
            "date": "2020-08-27",
            "count": 1
          },
          {
            "date": "2020-09-01",
            "count": 1
          },
          {
            "date": "2020-09-28",
            "count": 1
          },
          {
            "date": "2020-10-28",
            "count": 1
          },
          {
            "date": "2020-11-05",
            "count": 1
          },
          {
            "date": "2020-11-25",
            "count": 1
          },
          {
            "date": "2021-02-07",
            "count": 1
          },
          {
            "date": "2021-02-26",
            "count": 1
          },
          {
            "date": "2021-03-17",
            "count": 1
          },
          {
            "date": "2021-03-30",
            "count": 2
          },
          {
            "date": "2021-04-01",
            "count": 1
          },
          {
            "date": "2021-04-04",
            "count": 1
          },
          {
            "date": "2021-04-06",
            "count": 1
          },
          {
            "date": "2021-04-07",
            "count": 1
          },
          {
            "date": "2021-05-12",
            "count": 1
          },
          {
            "date": "2021-06-22",
            "count": 1
          },
          {
            "date": "2021-06-29",
            "count": 1
          },
          {
            "date": "2021-07-08",
            "count": 1
          },
          {
            "date": "2021-07-21",
            "count": 1
          },
          {
            "date": "2021-07-29",
            "count": 1
          },
          {
            "date": "2021-11-01",
            "count": 1
          },
          {
            "date": "2021-11-04",
            "count": 1
          },
          {
            "date": "2021-11-09",
            "count": 1
          },
          {
            "date": "2021-11-29",
            "count": 1
          },
          {
            "date": "2021-12-03",
            "count": 3
          },
          {
            "date": "2022-02-04",
            "count": 1
          },
          {
            "date": "2022-02-20",
            "count": 1
          },
          {
            "date": "2022-03-28",
            "count": 1
          },
          {
            "date": "2022-05-18",
            "count": 1
          },
          {
            "date": "2022-06-08",
            "count": 1
          },
          {
            "date": "2022-08-12",
            "count": 1
          },
          {
            "date": "2022-09-10",
            "count": 1
          },
          {
            "date": "2022-11-10",
            "count": 1
          },
          {
            "date": "2022-11-15",
            "count": 1
          },
          {
            "date": "2022-12-04",
            "count": 1
          },
          {
            "date": "2022-12-07",
            "count": 1
          },
          {
            "date": "2022-12-26",
            "count": 1
          },
          {
            "date": "2023-01-25",
            "count": 1
          },
          {
            "date": "2023-01-26",
            "count": 1
          },
          {
            "date": "2023-02-09",
            "count": 1
          },
          {
            "date": "2023-02-10",
            "count": 1
          },
          {
            "date": "2023-04-03",
            "count": 1
          },
          {
            "date": "2023-04-21",
            "count": 1
          },
          {
            "date": "2023-07-07",
            "count": 1
          },
          {
            "date": "2023-08-27",
            "count": 1
          },
          {
            "date": "2023-08-28",
            "count": 1
          },
          {
            "date": "2023-09-23",
            "count": 1
          },
          {
            "date": "2023-10-31",
            "count": 1
          },
          {
            "date": "2023-12-23",
            "count": 1
          },
          {
            "date": "2024-01-16",
            "count": 1
          },
          {
            "date": "2024-02-21",
            "count": 1
          },
          {
            "date": "2024-02-25",
            "count": 1
          },
          {
            "date": "2024-02-26",
            "count": 1
          },
          {
            "date": "2024-04-07",
            "count": 1
          },
          {
            "date": "2024-05-07",
            "count": 1
          },
          {
            "date": "2024-05-14",
            "count": 1
          },
          {
            "date": "2024-06-10",
            "count": 1
          },
          {
            "date": "2024-06-25",
            "count": 1
          },
          {
            "date": "2024-07-15",
            "count": 1
          },
          {
            "date": "2024-07-16",
            "count": 1
          },
          {
            "date": "2024-07-21",
            "count": 1
          },
          {
            "date": "2024-07-27",
            "count": 1
          },
          {
            "date": "2024-09-05",
            "count": 1
          },
          {
            "date": "2024-09-29",
            "count": 1
          },
          {
            "date": "2024-12-04",
            "count": 1
          },
          {
            "date": "2024-12-17",
            "count": 1
          },
          {
            "date": "2025-01-01",
            "count": 1
          },
          {
            "date": "2025-01-28",
            "count": 1
          },
          {
            "date": "2025-03-07",
            "count": 1
          },
          {
            "date": "2025-04-18",
            "count": 1
          },
          {
            "date": "2025-05-17",
            "count": 1
          },
          {
            "date": "2025-06-19",
            "count": 1
          },
          {
            "date": "2025-07-06",
            "count": 1
          },
          {
            "date": "2025-08-01",
            "count": 1
          },
          {
            "date": "2025-09-17",
            "count": 1
          },
          {
            "date": "2025-10-21",
            "count": 1
          },
          {
            "date": "2025-10-22",
            "count": 1
          },
          {
            "date": "2025-10-28",
            "count": 1
          },
          {
            "date": "2025-12-11",
            "count": 1
          },
          {
            "date": "2026-02-09",
            "count": 1
          },
          {
            "date": "2026-03-09",
            "count": 1
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-20",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-29",
            "count": 1
          },
          {
            "date": "2026-06-03",
            "count": 1
          },
          {
            "date": "2026-06-26",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 363,
        "total_stars": 365
      },
      "open_issues_and_prs": 95
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "example",
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile",
        "ocaml/forkexecd/helper/Makefile",
        "ocaml/ktls-helper/helper/Makefile",
        "ocaml/libs/vhd/Makefile",
        "ocaml/libs/xenctrl-ext/Makefile",
        "ocaml/xapi-storage/python/Makefile",
        "python3/Makefile",
        "python3/examples/Makefile",
        "scripts/Makefile",
        "unixpwd/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "doc/go.mod",
        "ocaml/sdk-gen/component-test/jsonrpc-client/go/go.mod",
        "ocaml/sdk-gen/csharp/autogen/XenServerTest/XenServerTest.csproj",
        "ocaml/sdk-gen/csharp/autogen/src/XenServer.csproj",
        "ocaml/sdk-gen/go/autogen/src/go.mod",
        "ocaml/sdk-gen/java/autogen/xen-api/pom.xml",
        "ocaml/sdk-gen/powershell/autogen/src/XenServerPowerShell.csproj"
      ],
      "largest_source_bytes": 93868,
      "source_files_sampled": 184,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "doc/go.mod",
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "com.fasterxml.jackson.core:jackson-databind",
            "direct": false,
            "version": "2.22.0",
            "severity": "moderate",
            "ecosystem": "maven",
            "cvss_score": 6.5,
            "advisory_ids": [
              "GHSA-5gvw-p9qm-jgwh",
              "GHSA-5jmj-h7xm-6q6v"
            ],
            "fixed_version": "3.2.1",
            "advisory_count": 2,
            "oldest_advisory_days": 28
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "moderate": 1
        },
        "advisory_count": 2,
        "affected_count": 1,
        "assessed_count": 16,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 1,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go",
        "pypi"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "github.com/mcshelby/hugo-theme-relearn",
            "direct": false,
            "version": "0.0.0-20250126200037-60bb1c65c5fc",
            "ecosystem": "go"
          },
          {
            "name": "com.fasterxml.jackson.core:jackson-databind",
            "direct": false,
            "version": "2.22.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.httpcomponents.client5:httpclient5",
            "direct": false,
            "version": "5.3",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-compiler-plugin",
            "direct": false,
            "version": "3.12.1",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-javadoc-plugin",
            "direct": false,
            "version": "3.6.3",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-source-plugin",
            "direct": false,
            "version": "3.3.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.apache.maven.plugins:maven-surefire-plugin",
            "direct": false,
            "version": "3.5.0",
            "ecosystem": "maven"
          },
          {
            "name": "org.junit.jupiter:junit-jupiter",
            "direct": false,
            "version": "5.11.1",
            "ecosystem": "maven"
          },
          {
            "name": "coverlet.collector",
            "direct": false,
            "version": "3.2.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.NET.Test.Sdk",
            "direct": false,
            "version": "17.5.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.PowerShell.5.ReferenceAssemblies",
            "direct": false,
            "version": "1.1.0",
            "ecosystem": "nuget"
          },
          {
            "name": "MSTest.TestAdapter",
            "direct": false,
            "version": "2.2.10",
            "ecosystem": "nuget"
          },
          {
            "name": "MSTest.TestFramework",
            "direct": false,
            "version": "2.2.10",
            "ecosystem": "nuget"
          },
          {
            "name": "Newtonsoft.Json",
            "direct": false,
            "version": "13.0.3",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Management.Automation",
            "direct": false,
            "version": "7.4.14",
            "ecosystem": "nuget"
          },
          {
            "name": "XenServer.NET",
            "direct": false,
            "version": "0.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "aiohttp",
            "direct": false,
            "version": null,
            "ecosystem": "pypi"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 17,
        "direct_count": 0,
        "indirect_count": 17
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 13,
        "merged_prs": 6210,
        "open_issues": 82,
        "closed_ratio": 0.539,
        "closed_issues": 96,
        "closed_unmerged_prs": 782
      },
      "bus_factor": 5,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "robhoes",
          "commits": 3753,
          "avatar_url": "https://avatars.githubusercontent.com/u/413005?v=4"
        },
        {
          "type": "User",
          "login": "johnelse",
          "commits": 2661,
          "avatar_url": "https://avatars.githubusercontent.com/u/112119?v=4"
        },
        {
          "type": "User",
          "login": "psafont",
          "commits": 2049,
          "avatar_url": "https://avatars.githubusercontent.com/u/5189409?v=4"
        },
        {
          "type": "User",
          "login": "edwintorok",
          "commits": 1589,
          "avatar_url": "https://avatars.githubusercontent.com/u/721894?v=4"
        },
        {
          "type": "User",
          "login": "lindig",
          "commits": 1192,
          "avatar_url": "https://avatars.githubusercontent.com/u/843617?v=4"
        },
        {
          "type": "User",
          "login": "jonludlam",
          "commits": 752,
          "avatar_url": "https://avatars.githubusercontent.com/u/210963?v=4"
        },
        {
          "type": "User",
          "login": "gaborigloi",
          "commits": 681,
          "avatar_url": "https://avatars.githubusercontent.com/u/10549240?v=4"
        },
        {
          "type": "User",
          "login": "simonjbeaumont",
          "commits": 629,
          "avatar_url": "https://avatars.githubusercontent.com/u/1125539?v=4"
        },
        {
          "type": "User",
          "login": "kc284",
          "commits": 515,
          "avatar_url": "https://avatars.githubusercontent.com/u/3705142?v=4"
        },
        {
          "type": "User",
          "login": "samoht",
          "commits": 506,
          "avatar_url": "https://avatars.githubusercontent.com/u/103693?v=4"
        }
      ],
      "contributors_sampled": 100,
      "top_contributor_share": 0.175
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "action.yml",
        "action.yml",
        "action.yml",
        "codechecker.yml",
        "docs.yml",
        "format.yml",
        "generate-and-build-sdks.yml",
        "hugo.yml",
        "main.yml",
        "other.yml",
        "release.yml",
        "shellcheck.yaml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": true,
      "has_linter_config": true,
      "has_precommit_config": true
    },
    "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": 8,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "11 out of 11 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": 10,
            "reason": "project has 33 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 9,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 7,
            "reason": "3 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "b08a580bbf78d2a774a065ed21b135c0af14a3cf",
        "ran_at": "2026-07-22T01:59:56Z",
        "aggregate_score": 7.2,
        "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-21T07:29:19Z",
      "oldest_open_prs": [
        {
          "number": 7070,
          "created_at": "2026-05-14T08:53:53Z",
          "last_comment_at": "2026-05-14T10:10:20Z",
          "last_comment_author": "lindig"
        },
        {
          "number": 7080,
          "created_at": "2026-05-18T15:05:12Z",
          "last_comment_at": "2026-06-08T14:15:45Z",
          "last_comment_author": "last-genius"
        },
        {
          "number": 7101,
          "created_at": "2026-05-27T21:38:36Z",
          "last_comment_at": "2026-07-17T09:46:32Z",
          "last_comment_author": "shindere"
        },
        {
          "number": 7122,
          "created_at": "2026-06-09T21:12:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 7137,
          "created_at": "2026-06-22T10:12:05Z",
          "last_comment_at": "2026-06-24T08:36:38Z",
          "last_comment_author": "gthvn1"
        },
        {
          "number": 7146,
          "created_at": "2026-06-28T07:49:29Z",
          "last_comment_at": "2026-07-02T20:58:44Z",
          "last_comment_author": "olivierlambert"
        },
        {
          "number": 7162,
          "created_at": "2026-07-02T15:19:03Z",
          "last_comment_at": "2026-07-16T06:51:03Z",
          "last_comment_author": "semarie"
        },
        {
          "number": 7169,
          "created_at": "2026-07-09T08:05:23Z",
          "last_comment_at": "2026-07-09T14:33:30Z",
          "last_comment_author": "MarkSymsCtx"
        },
        {
          "number": 7178,
          "created_at": "2026-07-15T06:44:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 7179,
          "created_at": "2026-07-15T13:02:33Z",
          "last_comment_at": "2026-07-16T09:22:16Z",
          "last_comment_author": "gthvn1"
        },
        {
          "number": 7184,
          "created_at": "2026-07-21T07:29:18Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 7185,
          "created_at": "2026-07-21T15:26:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 7186,
          "created_at": "2026-07-21T16:14:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-21T07:27:34Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 1289,
          "created_at": "2013-06-03T21:07:05Z",
          "last_comment_at": "2013-06-04T08:21:04Z",
          "last_comment_author": "amarao"
        },
        {
          "number": 1520,
          "created_at": "2013-10-20T12:50:08Z",
          "last_comment_at": "2016-02-05T10:48:09Z",
          "last_comment_author": "FlorianHeigl"
        },
        {
          "number": 2074,
          "created_at": "2015-01-07T18:01:30Z",
          "last_comment_at": "2015-01-12T13:02:25Z",
          "last_comment_author": "jonludlam"
        },
        {
          "number": 2218,
          "created_at": "2015-05-07T21:08:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2238,
          "created_at": "2015-05-27T05:43:19Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 2718,
          "created_at": "2016-07-31T19:50:38Z",
          "last_comment_at": "2016-08-01T10:08:29Z",
          "last_comment_author": "johnkeates"
        },
        {
          "number": 3769,
          "created_at": "2018-11-20T20:48:49Z",
          "last_comment_at": "2019-11-08T13:43:55Z",
          "last_comment_author": "Fungusware"
        },
        {
          "number": 3770,
          "created_at": "2018-11-20T20:55:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3794,
          "created_at": "2019-01-07T18:58:08Z",
          "last_comment_at": "2019-01-10T09:54:02Z",
          "last_comment_author": "olivierlambert"
        },
        {
          "number": 3805,
          "created_at": "2019-01-23T17:15:28Z",
          "last_comment_at": "2019-01-23T23:09:39Z",
          "last_comment_author": "mseri"
        },
        {
          "number": 3836,
          "created_at": "2019-03-30T22:12:18Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 3954,
          "created_at": "2019-09-15T19:47:26Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 4008,
          "created_at": "2019-12-30T10:25:44Z",
          "last_comment_at": "2020-01-02T10:22:39Z",
          "last_comment_author": "edwintorok"
        },
        {
          "number": 4072,
          "created_at": "2020-04-07T14:11:19Z",
          "last_comment_at": "2023-04-11T10:04:33Z",
          "last_comment_author": "psafont"
        },
        {
          "number": 4141,
          "created_at": "2020-06-22T13:49:04Z",
          "last_comment_at": "2020-06-23T08:35:45Z",
          "last_comment_author": "psafont"
        },
        {
          "number": 4145,
          "created_at": "2020-06-24T15:40:16Z",
          "last_comment_at": "2025-03-25T09:54:00Z",
          "last_comment_author": "ydirson"
        },
        {
          "number": 4159,
          "created_at": "2020-07-10T15:22:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 4178,
          "created_at": "2020-08-13T05:53:47Z",
          "last_comment_at": "2020-08-13T07:56:54Z",
          "last_comment_author": "cheese"
        },
        {
          "number": 4181,
          "created_at": "2020-08-13T16:07:02Z",
          "last_comment_at": "2020-08-14T13:42:45Z",
          "last_comment_author": "stormi"
        },
        {
          "number": 4231,
          "created_at": "2020-10-13T14:19:06Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/xapi-project/xen-api",
    "host": "github.com",
    "name": "xen-api",
    "owner": "xapi-project"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 84,
      "inputs": {
        "security": 78,
        "vitality": 96,
        "community": 68,
        "governance": 77,
        "engineering": 96
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 96,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "commits_last_year": 1185,
              "human_commit_share": 0.99,
              "days_since_last_push": 0,
              "active_weeks_last_year": 52
            },
            "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": "52/52 weeks with commits",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 52
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "1185 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 1185
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v26.1.17",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "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 ~7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 0,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 0 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 68,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "good",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "forks": 302,
              "stars": 365,
              "watchers": 51,
              "growth_state": "organic",
              "growth_factor_pct": 100
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "365 stars",
                "points": 41.5,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 365
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "302 forks",
                "points": 20.7,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 302
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "51 watchers",
                "points": 9.4,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 51
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 64,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "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": "license file present, not a recognized license",
                "points": 16.9,
                "status": "partial",
                "details": [
                  {
                    "code": "license_custom",
                    "params": {}
                  }
                ],
                "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": "good",
        "name": "Sustainability & Governance",
        "value": 77,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "excellent",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 88,
            "inputs": {
              "bus_factor": 5,
              "contributors_sampled": 100,
              "top_contributor_share": 0.175
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "5 contributor(s) cover half of all commits",
                "points": 45.9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 18% of commits",
                "points": 18.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 18
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "100 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 33 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "merged_prs": 6210,
              "open_issues": 82,
              "closed_issues": 96,
              "issue_closed_ratio": 0.539,
              "closed_unmerged_prs": 782
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "54% of issues closed",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 54
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "6210/6992 decided PRs merged",
                "points": 34,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 6210,
                      "decided": 6992
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "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": 68,
            "inputs": {
              "followers": 53,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "xapi-project",
              "public_repos": 102,
              "account_age_days": 5866
            },
            "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": "53 followers of xapi-project",
                "points": 12.5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 53,
                      "login": "xapi-project"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "102 public repos, account ~16 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 102
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 16
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "excellent",
        "name": "Engineering Quality",
        "value": 96,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": true,
              "has_precommit_config": true
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "12 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 12
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 9.6,
                "status": "met",
                "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": "11 out of 11 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": 90,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://xenproject.org/projects/xapi/",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://xenproject.org/projects/xapi/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": 78,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "good",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 7.2
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection is not maximal on development and all release branches",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "11 out of 11 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 33 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool 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": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "3 existing vulnerabilities detected",
                "points": 5.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 16 resolved dependencies against OSV; 1 could not be assessed (no resolved version, an unsupported ecosystem, or beyond the reported package list). This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 16
                }
              },
              {
                "code": "advisories_unassessed",
                "params": {
                  "count": 1
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 2,
              "affected_packages": 1,
              "assessed_packages": 16,
              "unassessed_packages": 1,
              "affected_by_severity": "moderate 1",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 16,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 15
            },
            "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": 64,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.909,
              "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": "90 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 90,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile",
                "ocaml/forkexecd/helper/Makefile",
                "ocaml/ktls-helper/helper/Makefile",
                "ocaml/libs/vhd/Makefile",
                "ocaml/libs/xenctrl-ext/Makefile",
                "ocaml/xapi-storage/python/Makefile",
                "python3/Makefile",
                "python3/examples/Makefile",
                "scripts/Makefile",
                "unixpwd/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.04,
              "toolchain_manifests": [
                "doc/go.mod",
                "ocaml/sdk-gen/component-test/jsonrpc-client/go/go.mod",
                "ocaml/sdk-gen/csharp/autogen/XenServerTest/XenServerTest.csproj",
                "ocaml/sdk-gen/csharp/autogen/src/XenServer.csproj",
                "ocaml/sdk-gen/go/autogen/src/go.mod",
                "ocaml/sdk-gen/java/autogen/xen-api/pom.xml",
                "ocaml/sdk-gen/powershell/autogen/src/XenServerPowerShell.csproj"
              ],
              "dependency_bot_commit_share": 0.01
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile, ocaml/forkexecd/helper/Makefile, ocaml/ktls-helper/helper/Makefile, ocaml/libs/vhd/Makefile, ocaml/libs/xenctrl-ext/Makefile, ocaml/xapi-storage/python/Makefile, python3/Makefile, python3/examples/Makefile, scripts/Makefile, unixpwd/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile, ocaml/forkexecd/helper/Makefile, ocaml/ktls-helper/helper/Makefile, ocaml/libs/vhd/Makefile, ocaml/libs/xenctrl-ext/Makefile, ocaml/xapi-storage/python/Makefile, python3/Makefile, python3/examples/Makefile, scripts/Makefile, unixpwd/Makefile"
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "OCaml (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "OCaml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "4 of the last 100 commits agent-authored or agent-credited",
                "points": 8,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 4,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "1 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "OCaml",
              "largest_source_bytes": 93868,
              "source_files_sampled": 184,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "OCaml (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "OCaml"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/184 source files over 60KB",
                "points": 54.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 184,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "example",
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "example, examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "example, examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Could not fetch pypi package 'xen-api' from its registry"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T02:00:32.495061Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/x/xapi-project/xen-api.svg",
  "full_name": "xapi-project/xen-api",
  "license_state": "custom",
  "license_spdx": null
}

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

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

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