公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-24 13:42 UTC

sillsdev / chorus

End-user collaboration library via 3-way xml merging and hg dvcs under the hood

C#未检测到许可证★ 5 星标⑂ 26 复刻始于 2013年11月在 GitHub 上查看 ↗

sillsdev/chorus 的健康指数为 100 分中的 55 分,处于「中等」区间。 其得分最高的类别是Sustainability & Governance(72/100),最低的是Community & Adoption(38/100)。 最近一次更新在今天。 近期的大部分工作由 3 位贡献者完成。

55
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

SIL LSDev组织
181 关注者303 个公开仓库始于 2011年10月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
NuGetSIL.Chorus.App5.1.0-31136 天前
NuGetSIL.Chorus.ChorusHub5.1.0-31136 天前
NuGetSIL.Chorus.LibChorus5.1.0-31136 天前
NuGetSIL.Chorus.ChorusMerge5.1.0-31136 天前
NuGetSIL.Chorus.ChorusHubApp5.1.0-31136 天前
NuGetSIL.Chorus.LibChorus.TestUtilities5.1.0-31136 天前

按类别列示的指标

活力

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

46存在风险 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
4.2/36提交节奏 — 52 周中有 6 周有提交
9/18提交量 — 最近一年 9 次提交
6/10OpenSSF Scorecard:Maintained — 8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6
所用输入
commits_last_year9
human_commit_share1
days_since_last_push0
active_weeks_last_year6

发布纪律

32存在风险
评分方式
27/27有发布版本 — 已发布 4 个发布版本
0/36发布时效 — 最近一次发布版本于 1,045 天前
5.4/27发布节奏 — 约每 1,031.2 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count4
latest_release_tagv5.1.0
releases_from_tags
days_since_latest_release1,045
mean_days_between_releases1,031.2

社区与采用

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

38存在风险 · 占总体的 18%
评分方式
9.8/60星标 — 5 个星标
11.7/25复刻 — 26 个复刻
5.6/15关注者 — 11 位关注者
所用输入
forks26
stars5
watchers11
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

25危急
评分方式
22.5/22.5README
0/22.5许可证 — 未检测到许可证文件
0/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
评分方式
58.3/80累计下载量 — nuget 合计历史 407,351 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packagesSIL.Chorus.App, SIL.Chorus.ChorusHub, SIL.Chorus.LibChorus, SIL.Chorus.ChorusMerge, SIL.Chorus.ChorusHubApp, SIL.Chorus.LibChorus.TestUtilities
dependents
ecosystemsnuget
total_downloads407,351
monthly_downloads
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

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

72良好 · 占总体的 24%
评分方式
36/54巴士系数 — 3 位贡献者贡献了半数提交
16.7/22.5提交分布 — 头号贡献者编写了 26% 的提交
13.5/13.5贡献者广度 — 37 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 6 contributing companies or organizations
所用输入
bus_factor3
contributors_sampled37
top_contributor_share0.259
评分方式
30.8/46.8议题解决 — 66% 的议题已关闭
32.6/38.3PR 接受 — 已裁定的 PR 中 290/340 已合并
15/15OpenSSF Scorecard:Code-Review — all changesets reviewed
所用输入
merged_prs290
open_issues15
closed_issues29
issue_closed_ratio0.659
closed_unmerged_prs50
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
16.2/25所有者影响力 — sillsdev 有 181 位关注者
25/25既往记录 — 303 个公开仓库,账户约 14 年
所用输入
followers181
owner_typeOrganization
is_verified
owner_loginsillsdev
public_repos303
account_age_days5,409
评分方式
25/25已发布且可解析 — nuget 上有 6 个软件包
4/35发布时效 — 最近一次发布于 1,136 天前
12/20版本历史 — 3 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesSIL.Chorus.App, SIL.Chorus.ChorusHub, SIL.Chorus.LibChorus, SIL.Chorus.ChorusMerge, SIL.Chorus.ChorusHubApp, SIL.Chorus.LibChorus.TestUtilities
ecosystemsnuget
any_deprecated
min_days_since_publish1,136

工程质量

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

56中等 · 占总体的 20%

工程实践

60中等
评分方式
24/24CI 工作流 — 4 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
6.4/6.4.editorconfig
6/20OpenSSF Scorecard:CI-Tests — 9 out of 26 merged PRs checked by a CI test -- score normalized to 3
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

50中等
评分方式
30/30README
0/25文档目录
0/15文档 / 主页站点
10/10仓库描述
10/10主题标签 — 10 个主题标签
0/10Wiki
所用输入
topicschorus, synchronization, conflict, xml, merge, send-receive, dvcs, hg, fieldworks, hacktoberfest
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

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

57中等 · 占总体的 16%

安全态势

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

AI 就绪度

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

61中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 77 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.77
agent_instruction_files
agent_instruction_max_bytes
评分方式
12.6/18一条命令的引导启动 — src/Chorus.Tests/Chorus.Tests.csproj, src/Chorus/Chorus.csproj, src/ChorusHub/ChorusHub.csproj(工具链约定,无任务运行器)
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — C#(静态类型)
0/10可复现环境
10/10已体现的代理实践 — 最近 100 次提交中有 5 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
6/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 6
所用输入
has_nix
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.05
toolchain_manifestssrc/Chorus.Tests/Chorus.Tests.csproj, src/Chorus/Chorus.csproj, src/ChorusHub/ChorusHub.csproj, src/ChorusHubApp/ChorusHubApp.csproj, src/ChorusHubTests/ChorusHubTests.csproj, src/ChorusMerge.Tests/ChorusMerge.Tests.csproj, src/ChorusMerge/ChorusMerge.csproj, src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj, src/LibChorus/LibChorus.csproj, src/LibChorusTests/LibChorus.Tests.csproj, src/SampleApp/SampleApp.csproj, src/Tests-ChorusPlugin/Tests-ChorusPlugin.csproj
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — C#(静态类型)
54.9/55可控的文件大小 — 采样的 438 个源文件中有 1 个超过 60KB
所用输入
primary_languageC#
largest_source_bytes78,425
source_files_sampled438
oversized_source_files1

关键数据

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

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

更多细节

Star 与 Fork 历史 0 ★ / 26 ⇿
0Star
26Fork
4发布

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

0510152025302622014-042019-052024-06
主版本 2次版本 1修订 0

每个点涵盖 10 天。

OpenSSF Scorecard 4.6 / 10
4.6综合

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

6Binary-Artifactsbinaries present in source code
不适用Branch-Protectioninternal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md
3CI-Tests9 out of 26 merged PRs checked by a CI test -- score normalized to 3
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
10Code-Reviewall changesets reviewed
10Contributorsproject has 6 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
6Maintained8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6
10Packagingpackaging workflow detected
6Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 6
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
直接依赖 73
注册表软件包版本约束清单文件
NuGetGitVersion.MsBuild5.10.3src/Chorus.Tests/Chorus.Tests.csproj
NuGetMicrosoft.NET.Test.Sdk17.14.1src/Chorus.Tests/Chorus.Tests.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/Chorus.Tests/Chorus.Tests.csproj
NuGetNUnit3.13.3src/Chorus.Tests/Chorus.Tests.csproj
NuGetNUnit3TestAdapter4.3.2src/Chorus.Tests/Chorus.Tests.csproj
NuGetGitVersion.MsBuild5.10.3src/Chorus/Chorus.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/Chorus/Chorus.csproj
NuGetSIL.ReleaseTasks3.0.0src/Chorus/Chorus.csproj
NuGetSIL.Windows.Forms18.0.0-*src/Chorus/Chorus.csproj
NuGetVulcan.Uczniowie.HelpProvider1.0.16src/Chorus/Chorus.csproj
NuGetGitVersion.MsBuild5.10.3src/ChorusHub/ChorusHub.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/ChorusHub/ChorusHub.csproj
NuGetSIL.ReleaseTasks3.0.0src/ChorusHub/ChorusHub.csproj
NuGetSIL.BuildTasks3.0.0src/ChorusHub/ChorusHub.csproj
NuGetGitVersion.MsBuild5.10.3src/ChorusHubApp/ChorusHubApp.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/ChorusHubApp/ChorusHubApp.csproj
NuGetSIL.ReleaseTasks3.0.0src/ChorusHubApp/ChorusHubApp.csproj
NuGetSIL.Windows.Forms18.0.0-*src/ChorusHubApp/ChorusHubApp.csproj
NuGetVulcan.Uczniowie.HelpProvider1.0.16src/ChorusHubApp/ChorusHubApp.csproj
NuGetGitVersion.MsBuild5.10.3src/ChorusHubTests/ChorusHubTests.csproj
NuGetMicrosoft.NET.Test.Sdk17.14.1src/ChorusHubTests/ChorusHubTests.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/ChorusHubTests/ChorusHubTests.csproj
NuGetNUnit3.13.3src/ChorusHubTests/ChorusHubTests.csproj
NuGetNUnit3TestAdapter4.3.2src/ChorusHubTests/ChorusHubTests.csproj
NuGetGitVersion.MsBuild5.10.3src/ChorusMerge.Tests/ChorusMerge.Tests.csproj
NuGetMicrosoft.NET.Test.Sdk17.14.1src/ChorusMerge.Tests/ChorusMerge.Tests.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/ChorusMerge.Tests/ChorusMerge.Tests.csproj
NuGetNewtonsoft.Json13.0.4src/ChorusMerge.Tests/ChorusMerge.Tests.csproj
NuGetNUnit3.13.3src/ChorusMerge.Tests/ChorusMerge.Tests.csproj
NuGetNUnit3TestAdapter4.3.2src/ChorusMerge.Tests/ChorusMerge.Tests.csproj
NuGetSIL.TestUtilities18.0.0-*src/ChorusMerge.Tests/ChorusMerge.Tests.csproj
NuGetGitVersion.MsBuild5.10.3src/ChorusMerge/ChorusMerge.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/ChorusMerge/ChorusMerge.csproj
NuGetSIL.ReleaseTasks3.0.0src/ChorusMerge/ChorusMerge.csproj
NuGetSystem.Runtime.InteropServices.RuntimeInformation4.3.0src/ChorusMerge/ChorusMerge.csproj
NuGetSystem.Text.Encoding.CodePages4.0.1src/ChorusMerge/ChorusMerge.csproj
NuGetGitVersion.MsBuild5.10.3src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj
NuGetNUnit3.13.3src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj
NuGetSIL.Core18.0.0-*src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj
NuGetSIL.ReleaseTasks3.0.0src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj
NuGetSIL.TestUtilities18.0.0-*src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj
NuGetAutofac4.9.4src/LibChorus/LibChorus.csproj
NuGetGitVersion.MsBuild5.10.3src/LibChorus/LibChorus.csproj
NuGeticu.net3.0.1src/LibChorus/LibChorus.csproj
NuGetIcu4c.Win.Min59.1.7src/LibChorus/LibChorus.csproj
NuGetL10NSharp10.0.0-*src/LibChorus/LibChorus.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/LibChorus/LibChorus.csproj
NuGetNDesk.DBus0.15.0src/LibChorus/LibChorus.csproj
NuGetSIL.Chorus.Mercurial6.5.*src/LibChorus/LibChorus.csproj
NuGetSIL.Core18.0.0-*src/LibChorus/LibChorus.csproj
NuGetSIL.Lift18.0.0-*src/LibChorus/LibChorus.csproj
NuGetSIL.ReleaseTasks3.0.0src/LibChorus/LibChorus.csproj
NuGetSystem.ComponentModel.Composition6.0.0src/LibChorus/LibChorus.csproj
NuGetSystem.Diagnostics.DiagnosticSource9.0.2src/LibChorus/LibChorus.csproj
NuGetSystem.Resources.Extensions6.0.0src/LibChorus/LibChorus.csproj
NuGetSystem.ServiceModel.Primitives4.8.1src/LibChorus/LibChorus.csproj
NuGetGitVersion.MsBuild5.10.3src/LibChorusTests/LibChorus.Tests.csproj
NuGetMicrosoft.NET.Test.Sdk17.14.1src/LibChorusTests/LibChorus.Tests.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/LibChorusTests/LibChorus.Tests.csproj
NuGetNewtonsoft.Json13.0.4src/LibChorusTests/LibChorus.Tests.csproj
NuGetNUnit3.13.3src/LibChorusTests/LibChorus.Tests.csproj
NuGetNUnit3TestAdapter4.3.2src/LibChorusTests/LibChorus.Tests.csproj
NuGetSharpZipLib1.3.3src/LibChorusTests/LibChorus.Tests.csproj
NuGetSIL.Core18.0.0-*src/LibChorusTests/LibChorus.Tests.csproj
NuGetSIL.TestUtilities18.0.0-*src/LibChorusTests/LibChorus.Tests.csproj
NuGetSIL.WritingSystems.Tests18.0.0-*src/LibChorusTests/LibChorus.Tests.csproj
NuGetSystem.IO.FileSystem.Primitives4.3.0src/LibChorusTests/LibChorus.Tests.csproj
NuGetGitVersion.MsBuild5.10.3src/SampleApp/SampleApp.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/SampleApp/SampleApp.csproj
NuGetSharpZipLib1.3.3src/SampleApp/SampleApp.csproj
NuGetGitVersion.MsBuild5.10.3src/Tests-ChorusPlugin/Tests-ChorusPlugin.csproj
NuGetMicrosoft.SourceLink.GitHub1.1.1src/Tests-ChorusPlugin/Tests-ChorusPlugin.csproj
全部依赖 28

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

注册表软件包版本关系
NuGetAutofac4.9.4直接
NuGetGitVersion.MsBuild5.10.3直接
NuGeticu.net3.0.1直接
NuGetIcu4c.Win.Min59.1.7直接
NuGetL10NSharp直接
NuGetMicrosoft.NET.Test.Sdk17.14.1直接
NuGetMicrosoft.SourceLink.GitHub1.1.1直接
NuGetNDesk.DBus0.15.0直接
NuGetNewtonsoft.Json13.0.4直接
NuGetNUnit3.13.3直接
NuGetNUnit3TestAdapter4.3.2直接
NuGetSharpZipLib1.3.3直接
NuGetSIL.BuildTasks3.0.0直接
NuGetSIL.Chorus.Mercurial直接
NuGetSIL.Core直接
NuGetSIL.Lift直接
NuGetSIL.ReleaseTasks3.0.0直接
NuGetSIL.TestUtilities直接
NuGetSIL.Windows.Forms直接
NuGetSIL.WritingSystems.Tests直接
NuGetSystem.ComponentModel.Composition6.0.0直接
NuGetSystem.Diagnostics.DiagnosticSource9.0.2直接
NuGetSystem.IO.FileSystem.Primitives4.3.0直接
NuGetSystem.Resources.Extensions6.0.0直接
NuGetSystem.Runtime.InteropServices.RuntimeInformation4.3.0直接
NuGetSystem.ServiceModel.Primitives4.8.1直接
NuGetSystem.Text.Encoding.CodePages4.0.1直接
NuGetVulcan.Uczniowie.HelpProvider1.0.16直接
依赖安全公告 0

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

没有已知公告影响已评估的依赖。

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

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "chorus",
        "synchronization",
        "conflict",
        "xml",
        "merge",
        "send-receive",
        "dvcs",
        "hg",
        "fieldworks",
        "hacktoberfest"
      ],
      "is_fork": false,
      "size_kb": 58923,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "C#": 2392533,
        "CSS": 973,
        "HTML": 3955,
        "XSLT": 114584,
        "Shell": 1311,
        "Batchfile": 2908
      },
      "pushed_at": "2026-07-24T12:55:06Z",
      "created_at": "2013-11-05T00:31:14Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-24T12:26:46Z",
      "description": "End-user collaboration library via 3-way xml merging and hg dvcs under the hood",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "master",
      "license_spdx_raw": null,
      "primary_language": "C#",
      "significant_languages": [
        "C#"
      ]
    },
    "owner": {
      "blog": "https://www.sil.org/",
      "name": "SIL LSDev",
      "type": "Organization",
      "login": "sillsdev",
      "company": null,
      "location": null,
      "followers": 181,
      "avatar_url": "https://avatars.githubusercontent.com/u/1095739?v=4",
      "created_at": "2011-10-02T00:05:38Z",
      "is_verified": null,
      "public_repos": 303,
      "account_age_days": 5409
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v5.1.0",
          "kind": "minor",
          "published_at": "2023-09-13T09:30:06Z"
        },
        {
          "tag": "v5.0.0",
          "kind": "major",
          "published_at": "2022-08-26T07:09:56Z"
        },
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2021-05-17T14:58:45Z"
        },
        {
          "tag": "chorus-hub/2.4.15",
          "kind": "other",
          "published_at": "2015-03-25T19:39:51Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "d8413afcccb631f5484e36090753290341917a0c",
          "body": "…HubServerInfo (#379)\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix IndexOutOfRangeException for query segments without '=' in Chorus…",
          "author_name": "D. Ror.",
          "author_login": "imnasnainaec",
          "committed_at": "2026-07-24T12:26:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7313dd64833484782da4e0f26655d04da70b5af6",
          "body": "LibChorus does not use WinForms directly. The package was only supplying a transitive System.ServiceModel framework reference on net462. Add explicit framework references in LibChorus and ChorusHub instead.\n\nCo-authored-by: Cursor <cursoragent@cursor.com>",
          "is_bot": false,
          "headline": "Remove L10NSharp.Windows.Forms from LibChorus (#388)",
          "author_name": "Kevin Hahn",
          "author_login": "hahn-kev",
          "committed_at": "2026-07-07T04:51:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fa2a2562d75adf4a4ced9745ab42449d8ba4ac43",
          "body": null,
          "is_bot": false,
          "headline": "Bump GHA l10n workflows to windows-latest (#378)",
          "author_name": "D. Ror.",
          "author_login": "imnasnainaec",
          "committed_at": "2026-07-03T10:07:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b115dd02cc92ed8bc103530f2a6693ba53abd6d2",
          "body": "Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix thread safety race in UsbDrives property (#383)",
          "author_name": "D. Ror.",
          "author_login": "imnasnainaec",
          "committed_at": "2026-07-02T13:04:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cdbc34c91d053895ed795f99feea9dcb1df46f86",
          "body": "…vice (#380)\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix silent data loss when record identifier is missing in XmlMergeSer…",
          "author_name": "D. Ror.",
          "author_login": "imnasnainaec",
          "committed_at": "2026-07-02T11:58:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3571e47f891b579fcb6f4856df80c7a723397f7d",
          "body": "Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "[Chorus.Model] Prevent ProtectedData crashes (#384)",
          "author_name": "D. Ror.",
          "author_login": "imnasnainaec",
          "committed_at": "2026-06-25T12:28:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "363c8d1064b6a6a0cf4c46eda5ec785dbbcefe96",
          "body": "* Update to libpalaso 18 and L10NSharp 10\n\nCo-authored-by: jasonleenaylor <2295227+jasonleenaylor@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Update to libpalaso 18 and L10NSharp 10 (#368)",
          "author_name": "Copilot",
          "author_login": "Copilot",
          "committed_at": "2026-05-18T18:39:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4848bb333f1219d7e4c1203a75a1482a117ff783",
          "body": "* Exceptions during hg push should be errors\n\n* Push to all targets even if some fail",
          "is_bot": false,
          "headline": "Exceptions during hg push should be errors (#367)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2026-05-06T07:06:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1ab24b9cd13563145e98a43e1551518c8f9cc303",
          "body": null,
          "is_bot": false,
          "headline": "Update libPalaso dependencies from version 15 to 17",
          "author_name": "Mark Kidder",
          "author_login": "mark-sil",
          "committed_at": "2025-10-09T16:23:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4165aa0507561af4930a037d21df0faa849bcbb",
          "body": null,
          "is_bot": false,
          "headline": "Update libPalaso dependencies from version 15 to 17",
          "author_name": "mark-sil",
          "author_login": "mark-sil",
          "committed_at": "2025-10-07T13:10:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af6e5c0e97758aef00bd2104b6c1ccf5719798ef",
          "body": "* trace HgRunner.Run calls\n\n* trace individual hg resume pushes and pulls\n\n* trace Synchronizer.cs SyncNow, SendToOthers, PullFromOthers and Merge\n\n* guard against null activity in `TagResumableParameters`",
          "is_bot": false,
          "headline": "Start tracing send recieve (#360)",
          "author_name": "Kevin Hahn",
          "author_login": "hahn-kev",
          "committed_at": "2025-02-25T02:40:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51c25ac0698c393584560edaf29b9897ca4f0369",
          "body": "* Correctly encode password in ServerSettingsModel\n\n* ubuntu-latest is 24.04 now, we still need 22.04\n\nWe still need a python2 package which 24.04 no longer offers, so run\nthis on 22.04 until the need for the python2 package goes away.",
          "is_bot": false,
          "headline": "Correctly encode password in ServerSettingsModel (#359)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2025-02-19T02:12:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49493f8a9628a1fb0df71b0dd781cd2d8d1130a3",
          "body": null,
          "is_bot": false,
          "headline": "A few more 461 -> 462 updates",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2024-11-27T16:38:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "391b232817f7af68e0e366f97199e2f6e09d2bbe",
          "body": "* This brings in a new version of L10nSharp with API changes",
          "is_bot": false,
          "headline": "Update libpalaso depdencies",
          "author_name": "Jason Naylor",
          "author_login": "jasonleenaylor",
          "committed_at": "2024-11-27T16:38:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0793f88ed96889752f9a833c4af7e70f8a50e1d1",
          "body": null,
          "is_bot": false,
          "headline": "Update framework to 462 and drop 461 build",
          "author_name": "Jason Naylor",
          "author_login": "jasonleenaylor",
          "committed_at": "2024-11-27T16:38:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56b160941e312a9b53df957fca97fd5cbc43d9a2",
          "body": "* Run tests in parallel, one per framework\n\nNow that tests run on three frameworks (net461, net6.0, net8.0), we can\nsave a lot of build time by running each framework's tests in parallel.\n\n* Ensure parallel test runs don't cancel each other\n\n* Don't specify framework for `dotnet build` step\n\n* Attem\n[…]\nneed to re-run the dotnet restore and build steps again.\n\n* Remove net6.0 targets\n\nEverything that uses Chorus now runs on net8.0 or higher.\n\n---------\n\nCo-authored-by: Kevin Hahn <kevin_hahn@sil.org>",
          "is_bot": false,
          "headline": "Run tests in parallel, one per framework (#354)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2024-11-18T02:57:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "15f882371a3604e08c683532b3fcbe269a79e285",
          "body": "Three env vars are defined, one that sets the path to the Mercurial\r\nexecutable directly (overriding both folder and exe name), one that\r\njust overrides the folder and lets Chorus pick the exe name, and one\r\nthat just overrides the exe name and lets Chorus pick the folder.",
          "is_bot": false,
          "headline": "Allow overriding hg.exe location with env vars (#353)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2024-11-07T08:00:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51bb8f80b4573056b7a2c9490751c54dedfcd2ab",
          "body": "* Replace Platform.IsMono with actual OS checks\r\n\r\nSome cases of Platform.IsMono are workarounds for bugs in older versions\r\nof mono. Those can probably be removed, but for safety's sake, we'll\r\nleave them alone for now.\r\n\r\nOther cases are clearly trying to check the platform, to run Linux-only\r\nor \n[…]\nn on Linux these days, it's running under dotnet\r\nrather than mono, and the Platform.IsMono check returns false.\r\n\r\n* Don't try to run Windows diff3.exe on Linux\r\n* Quote filenames with spaces in them",
          "is_bot": false,
          "headline": "Replace Platform.IsMono with actual OS checks (#356)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2024-11-07T05:59:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a6a70411ab7d7bfad3ec82b86ba30bcd442d25cc",
          "body": "v3 is deprecated and will stop working one month from now",
          "is_bot": false,
          "headline": "Use upload- and download-artifact v4 (#351)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2024-10-25T07:32:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "526358745e6ecbd73b76fbe805f7a01ea143f29d",
          "body": "Many times stderr's contents are just a single newline; there's no need\r\nto write that to the progress log. We also don't need to write double\r\nnewlines to the log, so trim the final trailing newline before writing.",
          "is_bot": false,
          "headline": "No more unnecessary empty \"stderr:\" lines in log (#349)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2024-09-23T08:33:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4535fc4bdf27c7d19df6e5dfc368d93494b5a884",
          "body": "GetTextFromQuery calls ExecuteErrorsOk, which already logs the value of\r\nstdout and stderr to the progress dialog. So there's no point in logging\r\nthe same value a second time.",
          "is_bot": false,
          "headline": "Don't duplicate hg process output (#347)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2024-09-07T06:49:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41c3d97428b99ac2c3d56458c81b8ae48d9a165c",
          "body": "In rare cases, a thread-scheduling race condition can cause a thread's\r\nstate to be ThreadState.Stopped even though it hasn't yet executed its\r\n`finally` block, which can result in result.StandardOutput or Error not\r\nbeing assigned a string, leaving them null. Furthermore, the C# docs say\r\nnot to de\n[…]\n its\r\nResults property; until then, Results is null.\r\n\r\nThis should guarantee the safety of the existing GetTextFromQuery code,\r\nbut to be safe we also make sure it can turn null into an empty string.",
          "is_bot": false,
          "headline": "Avoid NullReferenceExeption in GetTextFromQuery (#346)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2024-08-30T06:50:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d0b61c6e8542785798eeb0b42cd66db8291e40ad",
          "body": "* change how the resumable request urls are made to not lose the port number. Write tests for the URL formatting.\r\n\r\n* increase timeout for test runs\r\n\r\n- increase the timeout for long test runs\r\n- also add concurrency rule to cancel outdated runs still in progress\r\n\r\n---------\r\n\r\nCo-authored-by: Chris Hirt <chris@hirtfamily.net>",
          "is_bot": false,
          "headline": "fix case where port number is lost using resumable (#343)",
          "author_name": "Kevin Hahn",
          "author_login": "hahn-kev",
          "committed_at": "2024-08-14T01:30:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "104ce40716ad38b52e0794a1bdddf2891ca73d7a",
          "body": "…ndows\n\nUse correct hg executable on Windows",
          "is_bot": false,
          "headline": "Merge pull request #341 from sillsdev/bug/wrong-executable-used-on-wi…",
          "author_name": "Kevin Hahn",
          "author_login": "hahn-kev",
          "committed_at": "2024-05-21T22:37:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8a55243717b22a4178f731c76766c6d5c0a373c",
          "body": null,
          "is_bot": false,
          "headline": "Use correct hg executable on Windows",
          "author_name": "Tim Haasdyk",
          "author_login": "myieye",
          "committed_at": "2024-05-16T11:34:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38ecab3a4af8a5bba05ed1d65805bb219aa2464b",
          "body": "Most code paths replaced the user's Send/Receive password with a string\r\nof asterisks, but there was one code path where this was missed.",
          "is_bot": false,
          "headline": "Do not log Send/Receive passwords (#339)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2024-04-26T08:20:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccdf57d9d260821c7d567951e660b3ce02d53601",
          "body": "* refactor thread aborting to use tasks and cancellation tokens\r\n\r\n* use cancellation token for HgServeRunner.cs instead of thread abort\r\n\r\n* Fix HgProcessReaderTests on Linux\r\n\r\n* Fix ProcessStreamTests on Linux\r\n\r\n* Fix one last test on Linux\r\n\r\n* simplify client cleanup to happen when stopped\r\n\r\n---------\r\n\r\nCo-authored-by: Robin Munn <rmunn@pobox.com>",
          "is_bot": false,
          "headline": "switch away from thread abort where we can (#336)",
          "author_name": "Kevin Hahn",
          "author_login": "hahn-kev",
          "committed_at": "2024-04-15T20:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "04e1e281629260cdc89e718f418d9c0491859a44",
          "body": "* Also build for net8.0\r\n* Make GHA workflow run .NET 6 and 8\r\n* Update setup-dotnet action\r\n\r\nv2.1.0 was still trying to build against win7-x32 runtimes, which are no\r\nlonger offered in .NET 8. If we're using recent .NET, we need a recent\r\nsetup-dotnet version.\r\n\r\n* Fix RuntimeIdentifiers\r\n* Suppre\n[…]\nns, which is exactly the scenario that makes this test\r\nuseless. It's already disabled on Windows; there's no reason for it to\r\ncause the CI build to fail all the time when it's the only failing test.",
          "is_bot": false,
          "headline": "Also build for net8.0 (#332)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2024-03-20T17:51:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "04eda7903f3fe09d92cfc3edf91acea598c92744",
          "body": "We'll start by more than doubling the time we allocate for this test to\r\nrun, since the filesystem on a GitHub Actions runner appears slow. If\r\nthat isn't enough to fix it, we should remove the test entirely.",
          "is_bot": false,
          "headline": "Try to fix flaky test (#330)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2023-12-15T02:26:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3de3771529ce85f6ad4e0eb2ffa6d2c1fc975af4",
          "body": "* ChorusMerge: no more need to change input encoding\r\n\r\nWith the changes in Mercurial 6.5.1 and Python3, ChorusMerge now gets\r\ncorrectly-encoded Unicode filenames as input, without needing to go\r\nthrough a step where UTF-8 is double-encoded as CP1252.\r\n\r\n* Change/delete prompt text is different in h\n[…]\n* Update SIL.Chorus.Mercurial from 3.0.3 to 6.5.1\r\n* Update GeneratedMercurial.wxs file\r\n* Update GeneratedMercurialExtensions.wxs file\r\n* Update CHANGELOG to mention Mercurial 6.5.1\r\n\r\n+semver: major",
          "is_bot": false,
          "headline": "Update Chorus to use Mercurial 6.5.1 and Python 3 (#329)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2023-12-14T16:27:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "74871cb48a472282142e60e19088702825af2692",
          "body": "remove usage of BinaryFormatter",
          "is_bot": false,
          "headline": "Merge pull request #328 from sillsdev/remove-binary-formatter",
          "author_name": "Kevin Hahn",
          "author_login": "hahn-kev",
          "committed_at": "2023-10-27T12:28:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a51e777d0bceb0c44d77494673b0967d2d824e95",
          "body": "…factor Revision.cs to support serialization +semver:major",
          "is_bot": false,
          "headline": "remove usage of BinaryFormatter, transition to json serialization. Re…",
          "author_name": "Kevin Hahn",
          "author_login": "hahn-kev",
          "committed_at": "2023-10-27T02:28:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc230d52371a6ef475548eb5f26a42cf58d97371",
          "body": "* Copy l10n.proj etc. from Palaso\r\n* Update packages and fix paths\r\n* Remove .tmx files, ignore .xlf files\r\n\r\n* Update a l10n ID (to match identical strings) and a comment\r\n\r\n* Include GitHub Actions workflows in the solution and rename `dotnet` GHA to `ci+cd` for clarity\r\n\r\n* Exclude a flaky test on the platform that takes more time\r\n\r\n* Remove some dead code",
          "is_bot": false,
          "headline": "Implement and Document Localization (#326)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2023-10-18T21:11:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1b1e6cb12e770abb4ebc14107495bdc6f7a8a36",
          "body": "This is necessary so that Flex Bridge can supply required cloning information and start a repo download without direct/manual user input. This order will come from Fieldworks when launched from CMD or protocol handler with the proper arguments.\n\nRequired for https://github.com/sillsdev/languageforge\n[…]\nne\n\n* Revert user/pass after API clone\n\nWe want to give callers the option to revert, e.g. if they know the user/pass is JWT, but default it to saving them.\n\nCo-Authored-By: Hasso <hasso_pape@sil.org>",
          "is_bot": false,
          "headline": "Add public StartClone() method (#325)",
          "author_name": "josephmyers",
          "author_login": "josephmyers",
          "committed_at": "2023-10-13T14:33:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "84e6de03441f166579171d56d002914c7d0a0745",
          "body": null,
          "is_bot": false,
          "headline": "Update changelog",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2023-09-13T09:29:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "271b640d6ba47b0b6d6dc2bed049d10934f7ee02",
          "body": "* The files were still checked by the LargeFileFilter even though\n  they were never included in the repo causing unneeded warnings",
          "is_bot": false,
          "headline": "Add ChorusStorage (the bundle cache) as an Excluded folder (LT-21408)",
          "author_name": "Jason Naylor",
          "author_login": "jasonleenaylor",
          "committed_at": "2023-08-03T15:03:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "80bee2fd6f5e19bcd648d941c6969a5dbacf1cbf",
          "body": "- Fix check for empty project name\r\n- Save Internet URL only if logged in\r\n- Autogenerate Binding Redirects\r\n\r\nFixes https://jira.sil.org/browse/LT-21462",
          "is_bot": false,
          "headline": "Prevent S&R to Internet w/o full URL (#322)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2023-07-12T22:12:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdc43b0c9640068cd611a5940bdca76b121164b8",
          "body": "* While our meta tags are the recommended format for html, we sometimes parse the content as xml, so they must be closed",
          "is_bot": false,
          "headline": "Generate html header with self closing <meta/> (#321)",
          "author_name": "Jason Naylor",
          "author_login": "jasonleenaylor",
          "committed_at": "2023-07-10T22:29:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aee4a178827ce6b93653497b886cd19e67061e6b",
          "body": "* This fixes Fieldworks bug https://jira.sil.org/browse/LT-21086",
          "is_bot": false,
          "headline": "Add meta tag so that utf8 is used in conflict details views",
          "author_name": "Jason Naylor",
          "author_login": "jasonleenaylor",
          "committed_at": "2023-07-03T15:03:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26016928416c8760bbffa831da63457cc643a069",
          "body": null,
          "is_bot": false,
          "headline": "Add webm as audio-file-type so it gets 10MB limit",
          "author_name": "Tim Haasdyk",
          "author_login": "myieye",
          "committed_at": "2023-06-21T14:11:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa4a8c6a2e31600301a62d85cf351078d7d2e930",
          "body": "+semver: minor",
          "is_bot": false,
          "headline": "Update PackageReferences to palaso version 12",
          "author_name": "Jason Naylor",
          "author_login": "jasonleenaylor",
          "committed_at": "2023-06-14T14:51:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f0a6a6f3e0404e77df44d89de6a549afb019f5a",
          "body": "to allow tests to run in .NET Framework (https://github.com/nunit/nunit-console/issues/1176)",
          "is_bot": false,
          "headline": "Update to NUnit3TestAdapter 4.4.2 (#317)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2023-03-07T17:07:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7504501e0dfb15ee733924960e19da1f674625f4",
          "body": "* Escape credentials used in URLs\r\nSome users use their email addresses as their logins. When we overhauled the Get from Internet UX, we inadvertently stopped escaping credentials.\r\n* Allow users to type spaces in the password field\r\n* Properly encode spaces in passwords (not usernames)\r\nWe are not \n[…]\ns (some had been needlessly excluded)\r\n* Foolproof a test against developer machines set to use the QA server\r\n\r\nAddresses https://jira.sil.org/browse/LT-20157 and https://jira.sil.org/browse/LT-21275",
          "is_bot": false,
          "headline": "Allow special characters in credentials (LT-20157, LT-21275) (#316)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2023-03-02T19:14:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "954760857d7b96c81a1e2df3cf7d70d6b6db7d69",
          "body": "* Build Chorus Hub Installer with GitHub Actions\r\n* Update a deprecated WiX attribute\r\n* clean up (completes https://github.com/sillsdev/chorus/issues/299)\r\n* check out help in a clean location",
          "is_bot": false,
          "headline": "Build Chorus Hub Installer with GHA (#314)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-12-12T16:10:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33fd8cfbdfa13f4255f2a43ff7dabde5ef1a7f60",
          "body": "When it is opened from the FieldWorks Welcome dialog (and perhaps other times),\r\nit is the only dialog, so the application disappears from the taskbar entirely.",
          "is_bot": false,
          "headline": "Show the Receive Project dialog in the taskbar (#315)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-12-09T20:22:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6196ffdab2519f9fb196effc0767d9d57ef2e872",
          "body": "Bumps [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) to 13.0.2.\r\n<details>\r\n<summary>Release notes</summary>\r\n<p><em>Sourced from <a href=\"https://github.com/JamesNK/Newtonsoft.Json/releases\">Newtonsoft.Json's releases</a>.</em></p>\r\n<blockquote>\r\n<h2>13.0.2</h2>\r\n<ul>\r\n<li>New featur\n[…]\nK/Newtonsoft.Json/issues/2711\">#2711</a>)</li>\r\n<li>Additional commits viewable in <a href=\"https://github.com/JamesNK/Newtonsoft.Json/compare/12.0.3...13.0.2\">compare view</a></li>\r\n</ul>\r\n</details>",
          "is_bot": false,
          "headline": "Update to Newtonsoft.JSON to 13.0.2 (#312)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-12-08T22:47:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c4dd68da7138fbcbf5aa3a6201099949a80c6a2d",
          "body": "* Publish NuGet package for ChorusMergeModule.msm\r\n\r\nAddresses https://github.com/sillsdev/chorus/issues/299",
          "is_bot": false,
          "headline": "Build ChorusMergeModule (#310)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-12-08T20:25:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52c91118a39a0ceb1ad5754b5e72b03222aca279",
          "body": "* Update the EnricoMi/publish-unit-test-result-action (Fixes warnings about save-state and set-output deprecation)\r\n* install python2 prior to test execution\r\n* Update Deprecated API Calls: Assembly.CodeBase is now Assembly.Location\r\n* Fix unit test failures\r\n* Clean up some using directives\r\n\r\nCo-authored-by: Jason Naylor <jason_naylor@sil.org>",
          "is_bot": false,
          "headline": "Fix Unit Tests (#307)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-12-05T16:20:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa17de8b97f129b44689015643e04003d0a965da",
          "body": null,
          "is_bot": false,
          "headline": "increase audio and picture file size limit to 10MB (#301)",
          "author_name": "Christopher Hirt",
          "author_login": "megahirt",
          "committed_at": "2022-12-01T22:39:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "327aa7e32df8a00a37e3beb4f4f07ee716dea8a8",
          "body": "* Move Custom URL to the top so it's out of the Language Forge flow but still adjacent to Login (username) and Password\r\n* Comment on the use of '.languageforge.org'\r\n\r\nAddresses https://jira.sil.org/browse/LT-21209",
          "is_bot": false,
          "headline": "Reorder Custom URL outside Language Forge workflow (#304)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-12-01T17:19:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "265024782bef447297626fbac383d8a7afdd26c4",
          "body": "* Add Help button to Get from Internet Dialog\r\n* Adjust OK button position\r\n* Add &H to another Help (consistent with other usages)\r\n* Clarify that languageforge.org is Language Depot and update localization notes.\r\n\r\nPart of https://jira.sil.org/browse/LT-21209",
          "is_bot": false,
          "headline": "Clarify that languageforge.org is Language Depot (#305)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-11-30T14:10:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30b1a9b739e0775775705a4b055bac9d40541290",
          "body": "* Always show the log in URL (so users know into where they're logging)\r\n* Hide the folder name (and download button) control until the user has logged in or specified Custom URL\r\n* Revert the log in button's text to \"&Log in\"\r\n* Move the Log in button above the Custom URL control so it's closer to the username and password\r\n* Remove the obsolete TranslationMemory.Tmx\r\n\r\nThis addresses https://jira.sil.org/browse/LT-21209",
          "is_bot": false,
          "headline": "Improve Get from Internet UX (attempt) (#302)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-11-30T09:57:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12ec329637edc123532ab2415c9f4e0d2e8b725d",
          "body": "And don't fail fast",
          "is_bot": false,
          "headline": "Upgrade to Palaso 11 and Mercurial 3.0.3.6 (#300)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-10-13T15:13:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d1b3e3ff1263a48741f82babe3a1215aa0331aa",
          "body": "LibChorus now also runs its suite on .NET6. The bug was preventing LfMerge from a successful S/R in LanguageForge. There is another issue (in LfMerge) that is already fixed there. With these two fixes, LfMerge successfully uses the .NET6 version of ChorusMerge to resolve merge issues. Below are the \n[…]\nx change\r\n\r\nIt's certainly possible this actually specific to Mono, but I think it in fact applies to Linux as a whole, and the previous was a slight oversight. We'll see what the build server thinks.",
          "is_bot": false,
          "headline": ".hgrc points to chorusmerge on Linux (bugfix) (#297)",
          "author_name": "josephmyers",
          "author_login": "josephmyers",
          "committed_at": "2022-09-22T07:16:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9549415e9daa32031ca6870d11fa024335d2a2e4",
          "body": "LGTM doesn't support .NET 6 yet, so we're always getting failed\nchecks. This change modifies things so that LGTM tries to analyze\nthe code without building it first, which is less accurate but\nat least doesn't fail the check.",
          "is_bot": false,
          "headline": "Disable LGTM checks",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-09-14T17:41:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c78ae74674304430e7addd225cd07919ee6b7ef1",
          "body": "`ExternalFileModification_NotifiesIndices_ButSaveDoesNot` doesn't work\nreliably when run on GHA. This change ignores that test (or rather the\n`SkipOnBuildServer` test category) when running on Windows on GHA.",
          "is_bot": false,
          "headline": "Skip flaky test on Windows",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-09-14T17:41:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0afd696006e23e165b8b6ac202ab674e7c4fda3c",
          "body": null,
          "is_bot": false,
          "headline": "Ignore tests that require UI when testing with GHA",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-09-14T17:41:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5df687556c91d0abec6922923573266401301dc",
          "body": "According to the docs [^1] it is recommended to add\nMicrosoft.NET.Test.Sdk to all projects so that the tests can be\ndiscovered in VS.\n\nAlso add NUnit3TestAdapter to all test projects which is now\nrequired [^2] and remove NUnit from Tests-ChorusPlugin where it's\nnot used.\n\n[^1]: https://docs.nunit.org/articles/vs-test-adapter/Adapter-Installation.html\n[^2]: https://www.nuget.org/packages/NUnit3TestAdapter/4.2.1#readme-body-tab",
          "is_bot": false,
          "headline": "Add Microsoft.NET.Test.Sdk to test projects",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-09-14T17:41:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a713080a92e045e9e90e9840f7a37d4926f075a",
          "body": "ExternalFileModification_NotifiesIndices_ButSaveDoesNot() failed\nwith GitHub Actions. This change increases the total time we are\nwilling to wait to 10s instead of 30ms.",
          "is_bot": false,
          "headline": "Increase retries on flaky test",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-09-13T14:28:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39809613deea39c52f25f4e423960cc16e334efe",
          "body": "This is necessary to trigger a build when pushing a git tag which\nthen will create non-prerelease packages.",
          "is_bot": false,
          "headline": "Run GHA on tag push",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-09-13T14:28:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7ab5bcca7ae571374eb9c8d742a1975aec453f3",
          "body": "Removing `build/` subdirectory since we're building with GHA\nnow. `TestInstallerBuild.bat` (and the targets it calls in\n`Chorus.proj`) might still be relevant, but are terribly outdated\nso that it no longer works.",
          "is_bot": false,
          "headline": "Remove `build/` subdirectory",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-08-29T22:22:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "be02ce90d03a0d41c08a9b5ee1b5c515ff4a3bb3",
          "body": "Standardize DateTime formats (LT-20698), Clean Up",
          "is_bot": false,
          "headline": "Merge pull request #289 from sillsdev/fix/dateFormat",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-08-29T17:11:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83c5e355203ae01df6b244383030f3bc55a1a592",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'master' into fix/dateFormat",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-08-29T16:01:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "897cc4856e3457b2de7f099e29fa604ea43470fb",
          "body": null,
          "is_bot": false,
          "headline": "Remove outdated app.config",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-08-29T16:01:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6523ea2ce1709c9ff3f0d5ecda6116f6aebc0364",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'master' into fix/dateFormat",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-08-29T15:27:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45c506efc9b816f743a74d5c737ca7b1b5357878",
          "body": "This change updates `CHANGELOG.md` - we never released a v5.0.0\ndespite the entry in the changelog, and adjust the wording to\nreality since the non-existing release.\n\nAlso up-ing the minor version number because the previous\ncommit added support for netstandard 2.0/.net 6.\n\n+semver:minor",
          "is_bot": false,
          "headline": "Update changelog and readme",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-08-29T15:24:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed714768295d759819fe27940513ac079bbd3ff5",
          "body": "Deprecate LiftTimeFormatWithTimeZone\n\n+semver:minor",
          "is_bot": false,
          "headline": "Prefer Palaso's LiftDateTimeFormat",
          "author_name": "Hasso",
          "author_login": "papeh",
          "committed_at": "2022-08-29T14:54:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2deb29dad6da61aae03f0c91512ee9c996aeecb",
          "body": null,
          "is_bot": false,
          "headline": "Show test results",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-08-26T11:15:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "283b77439d8eee69da67bfbaa19e0eef734cf1fe",
          "body": "Inspired by https://jira.sil.org/browse/LT-20698",
          "is_bot": false,
          "headline": "Standardize DateTime formats (LT-20698)",
          "author_name": "Hasso",
          "author_login": "papeh",
          "committed_at": "2022-08-25T18:14:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2948734b05024ba4281d15e8c4e620606168320b",
          "body": "Added .NET Standard target to LibChorus and .NET6 to ChorusMerge.\r\n\r\nReferenced the appropriate libpalaso .NET Standard DLL's, which drop support for USB operations (RepositoryAddress.cs). For the .NET Standard version, those operations now return null. These methods were already returning null in o\n[…]\nrtedException, etc.\r\n\r\nUpgraded Autofac to v4.\r\n\r\nReplaced AppVeyor with GHA.\r\n\r\nCo-authored-by: Robin Munn <rmunn@pobox.com>\r\nCo-authored-by: Eberhard Beilharz <ermshiperete@users.noreply.github.com>",
          "is_bot": false,
          "headline": "Added .NET Standard target to LibChorus and .NET6 to ChorusMerge. (#279)",
          "author_name": "josephmyers",
          "author_login": "josephmyers",
          "committed_at": "2022-08-25T07:44:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "552108a6c4479ba0e22525cf1a801de750dbe543",
          "body": "* Update Mercurial to the version of SIL.Chorus.Mercurial package that explicitly uses Python 2.\r\n* Use SharpZipLib instead of deprecated ICSharpCode.SharpZipLib\r\n* Update GitVersion and SourceLink packages",
          "is_bot": false,
          "headline": "Update dependencies (#288)",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2022-08-09T21:07:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc62c4a9a801369c634ee571c93b02b46dd59ca3",
          "body": "* In https://jira.sil.org/browse/LT-20807 the problem seems to come up\n  when multiple processes are trying to write the file\n\n+semver:minor",
          "is_bot": false,
          "headline": "Fix file locking problem on Chorus Notes (LT-20807)",
          "author_name": "Jason Naylor",
          "author_login": "jasonleenaylor",
          "committed_at": "2022-08-04T15:47:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f2d87ee06192da3cb8c6eca31045f1cbdb775ca",
          "body": "If a ReflectionTypeLoadException is thrown by a unit test, include details in the test report.",
          "is_bot": false,
          "headline": "More helpful message for unit test failure (#285)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-08-03T14:21:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a6377abc3ca6991774c3c8bb552cd111fd946bab",
          "body": null,
          "is_bot": false,
          "headline": "Switch two problematic ldml elements to Atomic",
          "author_name": "Jason Naylor",
          "author_login": "jasonleenaylor",
          "committed_at": "2022-07-28T15:02:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "de093b37567e7789465918f8df101cb29671f8fe",
          "body": null,
          "is_bot": false,
          "headline": "Update NUnit and icu.net to the latest stable",
          "author_name": "Hasso",
          "author_login": "papeh",
          "committed_at": "2022-07-25T15:45:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "44bda12853d807f6a1aab103a505bb5dd051d40d",
          "body": null,
          "is_bot": false,
          "headline": "Upgrade to Palaso 10.* and Newtonsoft.Json 13.0.1",
          "author_name": "Hasso",
          "author_login": "papeh",
          "committed_at": "2022-07-25T15:45:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3079d1cf7b5ca411b725f4042d41d5d3bd7f4f7e",
          "body": "LT-20867: Cleanup Flexbridge login dialog",
          "is_bot": false,
          "headline": "Merge pull request #281 from sillsdev/feature/LT-20867",
          "author_name": "Mark Kidder",
          "author_login": "mark-sil",
          "committed_at": "2022-06-14T20:06:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "206ea9fa7491b9f401805b41503e462265eddf97",
          "body": "1. Change the ‘Log in’ button to “Log in to continue’.\n2. Disable the ‘Log in to continue’ button when logged in and no\n   edits have been made to either the username or password fields.\n3. Changed the Bandwidth and Project Id combo boxes so they are not\n   clipped.\n4. Change the Download button so it remains in the same relative\n   position when the dialog is resized.",
          "is_bot": false,
          "headline": "LT-20867: Cleanup Flexbridge login dialog",
          "author_name": "Mark Kidder",
          "author_login": "mark-sil",
          "committed_at": "2022-06-14T19:43:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ab57109ac35c3de8de2697e01cb6bb6918b7ab5",
          "body": "1. Change the ‘Log in’ button to “Log in to continue’.\n2. Disable the ‘Log in to continue’ button when logged in and no\n   edits have been made to either the username or password fields.\n3. Changed the Bandwidth and Project Id combo boxes so they are not\n   clipped.\n4. Change the Download button so it remains in the same relative\n   position when the dialog is resized.",
          "is_bot": false,
          "headline": "LT-20867: Cleanup Flexbridge login dialog",
          "author_name": "Mark Kidder",
          "author_login": "mark-sil",
          "committed_at": "2022-06-14T16:10:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7907605b28d8c7c02b3e2c7469cc7adcbd94c2a",
          "body": "LT-20999: Move the location of the local Chorus cache",
          "is_bot": false,
          "headline": "Merge pull request #280 from sillsdev/feature/LT-20999",
          "author_name": "Mark Kidder",
          "author_login": "mark-sil",
          "committed_at": "2022-05-09T17:48:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "141ce9dd7eea1b4c0e0b5c6585613af381581491",
          "body": "Move the location of the local Chorus cache from AppData to the\nspecific FLEX or WeSay project.  The problem we were seeing was when\nthe cache in AppData was being used by two applications; in this\ncase FLEX and WeSay. (Note that the same problem would exist if two\nlocal WeSay projects or two local \n[…]\nct information. This\nresults in one cache per application/project, so the cache should\nnever have more up to date chorus data than the local FLEX or\nWeSay project.\nhttps://jira.sil.org/browse/LT-20999",
          "is_bot": false,
          "headline": "LT-20999: Move the location of the local Chorus cache",
          "author_name": "Mark Kidder",
          "author_login": "mark-sil",
          "committed_at": "2022-04-29T01:39:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2b9cfef5c47712b49fb062231b4ae90cfebf479f",
          "body": "Move the location of the local Chorus cache from AppData to the\nspecific FLEX or WeSay project.  The problem we were seeing was when\nthe cache in AppData was being used by two applications; in this\ncase FLEX and WeSay. (Note that the same problem would exist if two\nlocal WeSay projects or two local \n[…]\nct folder, along with the other project information. This\nresults in one cache per application/project, so the cache should\nnever have more up to date chorus data than the local FLEX or\nWeSay project.",
          "is_bot": false,
          "headline": "LT-20999: Move the location of the local Chorus cache",
          "author_name": "Mark Kidder",
          "author_login": "mark-sil",
          "committed_at": "2022-04-28T18:38:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4600f3979ff5403f20f94795cef7bb77249b1ba6",
          "body": "Also remove unnecessary direct L10NSharp references (source through Palaso dependency).\n\nPart of https://jira.sil.org/browse/LT-20973 and https://jira.sil.org/browse/LT-20978",
          "is_bot": false,
          "headline": "Update L10NSharp to match what Palaso uses (#276)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-03-01T19:48:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c5190bfdfb06e01daf4fe7b87540350711914f8",
          "body": "* Log any caught exceptions\n* Log an informative message if the URL is malformed or the password contains reserved characters",
          "is_bot": false,
          "headline": "Improve logging when testing internet repo connections (#275)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-02-14T16:50:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9cf88cbc7b625eec8dd6bd7af8bba82c137e7897",
          "body": "Add static bool ServerSettingsModel.IsPrivateServer; if set to true, will use the private LanguageForge server.\r\n\r\n- Show the server URL label next to the Log in button when using the private or QA server\r\n- Try to list private projects, but continue with a warning on errors\r\n- TODO (server side): i\n[…]\nntials and use the main interface rather than entering a \"custom\" URL\r\n- Addresses https://jira.sil.org/browse/LT-20567 and https://jira.sil.org/browse/LT-20571\r\n\r\n+semver: minor\r\n\r\n- Update changelog",
          "is_bot": false,
          "headline": "[API] Add public property to use private LanguageForge (#273)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2022-01-11T17:23:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1b0d009a58aa718bae5185dd9e5dc0eff6af83f9",
          "body": null,
          "is_bot": false,
          "headline": "Add instructions to register to use the test server (#270)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2021-12-21T19:27:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62e91ca61714ca6897ee3f871805c103d2b5dad2",
          "body": "some users have problems with their USB drive (hardware?) such that GetDrives throws an exception which if not caught, results in a fatal exception for Chorus",
          "is_bot": false,
          "headline": "#261: Ignore USB GetDrives crash (#272)",
          "author_name": "bobeaton",
          "author_login": "bobeaton",
          "committed_at": "2021-11-01T16:57:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce80374ec6f35ae9fe1b5163a5441111bcb5fd63",
          "body": "Changed the size of the Send/Receive Settings dialog so some\ncontrols are not cut off.  Also populate the ‘Project Id’ combo\nbox if there is only one valid option.",
          "is_bot": false,
          "headline": "LT-20815: Change Send/Receive Settings dialog size",
          "author_name": "Mark Kidder",
          "author_login": "mark-sil",
          "committed_at": "2021-10-27T14:09:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6779090ba4c603e6aa8b75188e14bde59724d9b2",
          "body": "Because only release artifacts are available for Palaso, its Debug.Assert call does nothing, even though we register a custom TraceListener.",
          "is_bot": false,
          "headline": "Verify settings use CrossPlatformSettingsProvider (#267)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2021-10-21T13:51:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38dfb543d715ac517543598228ed7b05c9069d64",
          "body": "Not quite sure where they originated. I downloaded them from\nhttps://build.palaso.org/buildConfiguration/FLExBridgeDevelopWin32InstallerSansPublish/197613?buildTab=artifacts#%2FBuildMaster%2Fobjects%2FFLExBridge%2Flocalizations\nand wanted to check them in so they're easier to find.",
          "is_bot": false,
          "headline": "Check in old localizations",
          "author_name": "Hasso",
          "author_login": "papeh",
          "committed_at": "2021-10-06T22:40:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d0a443f3d52670a8ec4336adde4df4815c4131a",
          "body": "PR #256 moved common properties Directory.Build.props but missed\n`Chorus.csproj`.",
          "is_bot": false,
          "headline": "Use common props file in Chorus.csproj",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2021-10-01T16:47:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cc7f544e5be6affc63a02c43c776d20744e026f",
          "body": "This makes settings more robust during upgrades.\r\nThis addresses https://jira.sil.org/browse/LT-20801",
          "is_bot": false,
          "headline": "Use CrossPlatformSettingsProvider (#265)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2021-09-16T14:41:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dec2f4f0273200377135660c098b39078d8d3a1",
          "body": "+semver:major",
          "is_bot": false,
          "headline": "Update to the latest version of palaso libraries",
          "author_name": "Jason Naylor",
          "author_login": "jasonleenaylor",
          "committed_at": "2021-09-13T13:59:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "200187c779466ceb23c556d08eaa6717fbd9752b",
          "body": "and rename commandToLog to clarify its purpose.",
          "is_bot": false,
          "headline": "Authenticate using the real password (#262)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2021-09-09T13:19:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea5d3715ec7577d1afec5c4a09d61cbee1934be6",
          "body": "* Catch exception trying to read the LastWriteTime from\n  the ChorusNotes file and retry\n* Ignore failures after the retry instead of crashing\n* Fixes FB issue LT-20685",
          "is_bot": false,
          "headline": "Address ChorusNotes UnauthorizedAccess exception (#260)",
          "author_name": "Jason Naylor",
          "author_login": "jasonleenaylor",
          "committed_at": "2021-09-02T21:07:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49b9f35a97ad5399325dc6c870dd9d02b9fd0cc1",
          "body": null,
          "is_bot": false,
          "headline": "Require newer L10nSharp (#259)",
          "author_name": "papeh",
          "author_login": "papeh",
          "committed_at": "2021-08-20T18:48:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a95a48bb3d7651e27137c15126d57313e88aae4d",
          "body": "* And a few refactorings",
          "is_bot": false,
          "headline": "Move common properties to Directory.Build.props (#256)",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2021-08-20T15:03:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e2ba2df50bfbb04017e24ddeb5aac4037d9e1d65",
          "body": "The Send/Receive code does a lot of `hg log -rREV --template \"{node}\"`\r\ncalls in order to learn the long hash of a revision number. This happens\r\nvery often during a Send/Receive process: the Chorus logs are full of\r\n`hg log -r0` operations. Thing is, every single call to `hg log` incurs\r\na cost as \n[…]\nng backwards from tip\", i.e.\r\nrunning `hg log -r-1 --template \"{node}\" gets the long hash of the tip\r\nrevision. We therefore should not cache negative revision numbers as\r\nthose are subject to change.",
          "is_bot": false,
          "headline": "Speed up Send/Receive operations significantly (#258)",
          "author_name": "Robin Munn",
          "author_login": "rmunn",
          "committed_at": "2021-08-20T12:31:20Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a3efadb4c281b5c3d6fe62f35bd67390aa504083",
          "body": "Building the ChorusHubInstaller should not depend on running the\nunit tests but instead on the compile (build) step.",
          "is_bot": false,
          "headline": "Fix ChorusHubInstaller build",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2021-05-18T07:16:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df1efd6403f286f8b3e2bd4d19d1ccf25009ff5e",
          "body": "Merge feature/nuget into master",
          "is_bot": false,
          "headline": "Merge pull request #254 from ermshiperete/master",
          "author_name": "Eberhard Beilharz",
          "author_login": "ermshiperete",
          "committed_at": "2021-05-17T14:53:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 4,
      "commits_last_year": 9,
      "latest_release_at": "2023-09-13T09:30:06Z",
      "latest_release_tag": "v5.1.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 6,
      "days_since_latest_release": 1045,
      "mean_days_between_releases": 1031.2
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "SIL.Chorus.App",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/SIL.Chorus.App",
          "is_deprecated": false,
          "latest_version": "5.1.0",
          "repository_url": "https://github.com/sillsdev/chorus",
          "versions_count": 3,
          "total_downloads": 82689,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2023-06-13T18:29:26.553000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1136
        },
        {
          "name": "SIL.Chorus.ChorusHub",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/SIL.Chorus.ChorusHub",
          "is_deprecated": false,
          "latest_version": "5.1.0",
          "repository_url": "https://github.com/sillsdev/chorus",
          "versions_count": 3,
          "total_downloads": 72804,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2023-06-13T18:29:27.143000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1136
        },
        {
          "name": "SIL.Chorus.LibChorus",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/SIL.Chorus.LibChorus",
          "is_deprecated": false,
          "latest_version": "5.1.0",
          "repository_url": "https://github.com/sillsdev/chorus",
          "versions_count": 3,
          "total_downloads": 79612,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2023-06-13T18:29:28.687000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1136
        },
        {
          "name": "SIL.Chorus.ChorusMerge",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/SIL.Chorus.ChorusMerge",
          "is_deprecated": false,
          "latest_version": "5.1.0",
          "repository_url": "https://github.com/sillsdev/chorus",
          "versions_count": 3,
          "total_downloads": 65568,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2023-06-13T18:29:28.140000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1136
        },
        {
          "name": "SIL.Chorus.ChorusHubApp",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/SIL.Chorus.ChorusHubApp",
          "is_deprecated": false,
          "latest_version": "5.1.0",
          "repository_url": "https://github.com/sillsdev/chorus",
          "versions_count": 3,
          "total_downloads": 72988,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2023-06-13T18:29:27.660000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1136
        },
        {
          "name": "SIL.Chorus.LibChorus.TestUtilities",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "nuget",
          "matches_repo": true,
          "registry_url": "https://www.nuget.org/packages/SIL.Chorus.LibChorus.TestUtilities",
          "is_deprecated": false,
          "latest_version": "5.1.0",
          "repository_url": "https://github.com/sillsdev/chorus",
          "versions_count": 3,
          "total_downloads": 33690,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2023-06-13T18:29:29.260000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 1136
        }
      ]
    },
    "popularity": {
      "forks": 26,
      "stars": 5,
      "watchers": 11,
      "fork_history": {
        "days": [
          {
            "date": "2014-04-15",
            "count": 1
          },
          {
            "date": "2014-05-12",
            "count": 1
          },
          {
            "date": "2014-06-06",
            "count": 1
          },
          {
            "date": "2014-08-18",
            "count": 1
          },
          {
            "date": "2014-08-26",
            "count": 1
          },
          {
            "date": "2014-09-02",
            "count": 1
          },
          {
            "date": "2014-11-03",
            "count": 1
          },
          {
            "date": "2014-12-12",
            "count": 1
          },
          {
            "date": "2015-04-29",
            "count": 1
          },
          {
            "date": "2016-07-29",
            "count": 1
          },
          {
            "date": "2016-10-17",
            "count": 1
          },
          {
            "date": "2017-05-02",
            "count": 1
          },
          {
            "date": "2017-06-02",
            "count": 1
          },
          {
            "date": "2017-06-07",
            "count": 1
          },
          {
            "date": "2017-08-11",
            "count": 1
          },
          {
            "date": "2017-09-21",
            "count": 1
          },
          {
            "date": "2017-11-01",
            "count": 1
          },
          {
            "date": "2018-12-13",
            "count": 1
          },
          {
            "date": "2019-10-17",
            "count": 1
          },
          {
            "date": "2019-10-24",
            "count": 1
          },
          {
            "date": "2020-02-27",
            "count": 1
          },
          {
            "date": "2020-03-17",
            "count": 1
          },
          {
            "date": "2022-04-25",
            "count": 1
          },
          {
            "date": "2022-12-08",
            "count": 1
          },
          {
            "date": "2023-06-20",
            "count": 1
          },
          {
            "date": "2024-06-16",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 26,
        "total_forks": 26
      },
      "star_history": null,
      "open_issues_and_prs": 20
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "src/Chorus.Tests/Chorus.Tests.csproj",
        "src/Chorus/Chorus.csproj",
        "src/ChorusHub/ChorusHub.csproj",
        "src/ChorusHubApp/ChorusHubApp.csproj",
        "src/ChorusHubTests/ChorusHubTests.csproj",
        "src/ChorusMerge.Tests/ChorusMerge.Tests.csproj",
        "src/ChorusMerge/ChorusMerge.csproj",
        "src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj",
        "src/LibChorus/LibChorus.csproj",
        "src/LibChorusTests/LibChorus.Tests.csproj",
        "src/SampleApp/SampleApp.csproj",
        "src/Tests-ChorusPlugin/Tests-ChorusPlugin.csproj"
      ],
      "largest_source_bytes": 78425,
      "source_files_sampled": 438,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 21,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 7,
        "direct_affected_count": 0
      },
      "ecosystems": [],
      "dependencies": [
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/Chorus.Tests/Chorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "Microsoft.NET.Test.Sdk",
          "manifest": "src/Chorus.Tests/Chorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "17.14.1"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/Chorus.Tests/Chorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        },
        {
          "name": "NUnit",
          "manifest": "src/Chorus.Tests/Chorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.13.3"
        },
        {
          "name": "NUnit3TestAdapter",
          "manifest": "src/Chorus.Tests/Chorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.3.2"
        },
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/Chorus/Chorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/Chorus/Chorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        },
        {
          "name": "SIL.ReleaseTasks",
          "manifest": "src/Chorus/Chorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.0.0"
        },
        {
          "name": "SIL.Windows.Forms",
          "manifest": "src/Chorus/Chorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "18.0.0-*"
        },
        {
          "name": "Vulcan.Uczniowie.HelpProvider",
          "manifest": "src/Chorus/Chorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.0.16"
        },
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/ChorusHub/ChorusHub.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/ChorusHub/ChorusHub.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        },
        {
          "name": "SIL.ReleaseTasks",
          "manifest": "src/ChorusHub/ChorusHub.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.0.0"
        },
        {
          "name": "SIL.BuildTasks",
          "manifest": "src/ChorusHub/ChorusHub.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.0.0"
        },
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/ChorusHubApp/ChorusHubApp.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/ChorusHubApp/ChorusHubApp.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        },
        {
          "name": "SIL.ReleaseTasks",
          "manifest": "src/ChorusHubApp/ChorusHubApp.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.0.0"
        },
        {
          "name": "SIL.Windows.Forms",
          "manifest": "src/ChorusHubApp/ChorusHubApp.csproj",
          "ecosystem": "nuget",
          "version_constraint": "18.0.0-*"
        },
        {
          "name": "Vulcan.Uczniowie.HelpProvider",
          "manifest": "src/ChorusHubApp/ChorusHubApp.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.0.16"
        },
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/ChorusHubTests/ChorusHubTests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "Microsoft.NET.Test.Sdk",
          "manifest": "src/ChorusHubTests/ChorusHubTests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "17.14.1"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/ChorusHubTests/ChorusHubTests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        },
        {
          "name": "NUnit",
          "manifest": "src/ChorusHubTests/ChorusHubTests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.13.3"
        },
        {
          "name": "NUnit3TestAdapter",
          "manifest": "src/ChorusHubTests/ChorusHubTests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.3.2"
        },
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/ChorusMerge.Tests/ChorusMerge.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "Microsoft.NET.Test.Sdk",
          "manifest": "src/ChorusMerge.Tests/ChorusMerge.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "17.14.1"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/ChorusMerge.Tests/ChorusMerge.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        },
        {
          "name": "Newtonsoft.Json",
          "manifest": "src/ChorusMerge.Tests/ChorusMerge.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "13.0.4"
        },
        {
          "name": "NUnit",
          "manifest": "src/ChorusMerge.Tests/ChorusMerge.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.13.3"
        },
        {
          "name": "NUnit3TestAdapter",
          "manifest": "src/ChorusMerge.Tests/ChorusMerge.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.3.2"
        },
        {
          "name": "SIL.TestUtilities",
          "manifest": "src/ChorusMerge.Tests/ChorusMerge.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "18.0.0-*"
        },
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/ChorusMerge/ChorusMerge.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/ChorusMerge/ChorusMerge.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        },
        {
          "name": "SIL.ReleaseTasks",
          "manifest": "src/ChorusMerge/ChorusMerge.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.0.0"
        },
        {
          "name": "System.Runtime.InteropServices.RuntimeInformation",
          "manifest": "src/ChorusMerge/ChorusMerge.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.3.0"
        },
        {
          "name": "System.Text.Encoding.CodePages",
          "manifest": "src/ChorusMerge/ChorusMerge.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.0.1"
        },
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        },
        {
          "name": "NUnit",
          "manifest": "src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.13.3"
        },
        {
          "name": "SIL.Core",
          "manifest": "src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj",
          "ecosystem": "nuget",
          "version_constraint": "18.0.0-*"
        },
        {
          "name": "SIL.ReleaseTasks",
          "manifest": "src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.0.0"
        },
        {
          "name": "SIL.TestUtilities",
          "manifest": "src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj",
          "ecosystem": "nuget",
          "version_constraint": "18.0.0-*"
        },
        {
          "name": "Autofac",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.9.4"
        },
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "icu.net",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.0.1"
        },
        {
          "name": "Icu4c.Win.Min",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "59.1.7"
        },
        {
          "name": "L10NSharp",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "10.0.0-*"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        },
        {
          "name": "NDesk.DBus",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "0.15.0"
        },
        {
          "name": "SIL.Chorus.Mercurial",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "6.5.*"
        },
        {
          "name": "SIL.Core",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "18.0.0-*"
        },
        {
          "name": "SIL.Lift",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "18.0.0-*"
        },
        {
          "name": "SIL.ReleaseTasks",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.0.0"
        },
        {
          "name": "System.ComponentModel.Composition",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "6.0.0"
        },
        {
          "name": "System.Diagnostics.DiagnosticSource",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "9.0.2"
        },
        {
          "name": "System.Resources.Extensions",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "6.0.0"
        },
        {
          "name": "System.ServiceModel.Primitives",
          "manifest": "src/LibChorus/LibChorus.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.8.1"
        },
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/LibChorusTests/LibChorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "Microsoft.NET.Test.Sdk",
          "manifest": "src/LibChorusTests/LibChorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "17.14.1"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/LibChorusTests/LibChorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        },
        {
          "name": "Newtonsoft.Json",
          "manifest": "src/LibChorusTests/LibChorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "13.0.4"
        },
        {
          "name": "NUnit",
          "manifest": "src/LibChorusTests/LibChorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "3.13.3"
        },
        {
          "name": "NUnit3TestAdapter",
          "manifest": "src/LibChorusTests/LibChorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.3.2"
        },
        {
          "name": "SharpZipLib",
          "manifest": "src/LibChorusTests/LibChorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.3.3"
        },
        {
          "name": "SIL.Core",
          "manifest": "src/LibChorusTests/LibChorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "18.0.0-*"
        },
        {
          "name": "SIL.TestUtilities",
          "manifest": "src/LibChorusTests/LibChorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "18.0.0-*"
        },
        {
          "name": "SIL.WritingSystems.Tests",
          "manifest": "src/LibChorusTests/LibChorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "18.0.0-*"
        },
        {
          "name": "System.IO.FileSystem.Primitives",
          "manifest": "src/LibChorusTests/LibChorus.Tests.csproj",
          "ecosystem": "nuget",
          "version_constraint": "4.3.0"
        },
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/SampleApp/SampleApp.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/SampleApp/SampleApp.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        },
        {
          "name": "SharpZipLib",
          "manifest": "src/SampleApp/SampleApp.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.3.3"
        },
        {
          "name": "GitVersion.MsBuild",
          "manifest": "src/Tests-ChorusPlugin/Tests-ChorusPlugin.csproj",
          "ecosystem": "nuget",
          "version_constraint": "5.10.3"
        },
        {
          "name": "Microsoft.SourceLink.GitHub",
          "manifest": "src/Tests-ChorusPlugin/Tests-ChorusPlugin.csproj",
          "ecosystem": "nuget",
          "version_constraint": "1.1.1"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "Autofac",
            "direct": true,
            "version": "4.9.4",
            "ecosystem": "nuget"
          },
          {
            "name": "GitVersion.MsBuild",
            "direct": true,
            "version": "5.10.3",
            "ecosystem": "nuget"
          },
          {
            "name": "icu.net",
            "direct": true,
            "version": "3.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Icu4c.Win.Min",
            "direct": true,
            "version": "59.1.7",
            "ecosystem": "nuget"
          },
          {
            "name": "L10NSharp",
            "direct": true,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.NET.Test.Sdk",
            "direct": true,
            "version": "17.14.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Microsoft.SourceLink.GitHub",
            "direct": true,
            "version": "1.1.1",
            "ecosystem": "nuget"
          },
          {
            "name": "NDesk.DBus",
            "direct": true,
            "version": "0.15.0",
            "ecosystem": "nuget"
          },
          {
            "name": "Newtonsoft.Json",
            "direct": true,
            "version": "13.0.4",
            "ecosystem": "nuget"
          },
          {
            "name": "NUnit",
            "direct": true,
            "version": "3.13.3",
            "ecosystem": "nuget"
          },
          {
            "name": "NUnit3TestAdapter",
            "direct": true,
            "version": "4.3.2",
            "ecosystem": "nuget"
          },
          {
            "name": "SharpZipLib",
            "direct": true,
            "version": "1.3.3",
            "ecosystem": "nuget"
          },
          {
            "name": "SIL.BuildTasks",
            "direct": true,
            "version": "3.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "SIL.Chorus.Mercurial",
            "direct": true,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "SIL.Core",
            "direct": true,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "SIL.Lift",
            "direct": true,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "SIL.ReleaseTasks",
            "direct": true,
            "version": "3.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "SIL.TestUtilities",
            "direct": true,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "SIL.Windows.Forms",
            "direct": true,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "SIL.WritingSystems.Tests",
            "direct": true,
            "version": null,
            "ecosystem": "nuget"
          },
          {
            "name": "System.ComponentModel.Composition",
            "direct": true,
            "version": "6.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Diagnostics.DiagnosticSource",
            "direct": true,
            "version": "9.0.2",
            "ecosystem": "nuget"
          },
          {
            "name": "System.IO.FileSystem.Primitives",
            "direct": true,
            "version": "4.3.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Resources.Extensions",
            "direct": true,
            "version": "6.0.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Runtime.InteropServices.RuntimeInformation",
            "direct": true,
            "version": "4.3.0",
            "ecosystem": "nuget"
          },
          {
            "name": "System.ServiceModel.Primitives",
            "direct": true,
            "version": "4.8.1",
            "ecosystem": "nuget"
          },
          {
            "name": "System.Text.Encoding.CodePages",
            "direct": true,
            "version": "4.0.1",
            "ecosystem": "nuget"
          },
          {
            "name": "Vulcan.Uczniowie.HelpProvider",
            "direct": true,
            "version": "1.0.16",
            "ecosystem": "nuget"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 28,
        "direct_count": 28,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 5,
        "merged_prs": 290,
        "open_issues": 15,
        "closed_ratio": 0.659,
        "closed_issues": 29,
        "closed_unmerged_prs": 50
      },
      "bus_factor": 3,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "regnrand",
          "commits": 681,
          "avatar_url": "https://avatars.githubusercontent.com/u/639605?v=4"
        },
        {
          "type": "User",
          "login": "hatton",
          "commits": 570,
          "avatar_url": "https://avatars.githubusercontent.com/u/8448?v=4"
        },
        {
          "type": "User",
          "login": "jasonleenaylor",
          "commits": 253,
          "avatar_url": "https://avatars.githubusercontent.com/u/2295227?v=4"
        },
        {
          "type": "User",
          "login": "cambell-prince",
          "commits": 203,
          "avatar_url": "https://avatars.githubusercontent.com/u/599797?v=4"
        },
        {
          "type": "User",
          "login": "ermshiperete",
          "commits": 145,
          "avatar_url": "https://avatars.githubusercontent.com/u/181336?v=4"
        },
        {
          "type": "User",
          "login": "JohnThomson",
          "commits": 130,
          "avatar_url": "https://avatars.githubusercontent.com/u/1360521?v=4"
        },
        {
          "type": "User",
          "login": "papeh",
          "commits": 118,
          "avatar_url": "https://avatars.githubusercontent.com/u/4933670?v=4"
        },
        {
          "type": "User",
          "login": "megahirt",
          "commits": 108,
          "avatar_url": "https://avatars.githubusercontent.com/u/3444521?v=4"
        },
        {
          "type": "User",
          "login": "gmartin7",
          "commits": 102,
          "avatar_url": "https://avatars.githubusercontent.com/u/2300551?v=4"
        },
        {
          "type": "User",
          "login": "StephenMcConnel",
          "commits": 57,
          "avatar_url": "https://avatars.githubusercontent.com/u/2228246?v=4"
        }
      ],
      "contributors_sampled": 37,
      "top_contributor_share": 0.259
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci+cd.yml",
        "l10n-packaging.yml",
        "l10n-source.yml",
        "test-results.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": true,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 6,
            "reason": "binaries present in source code",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": null,
            "reason": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 3,
            "reason": "9 out of 26 merged PRs checked by a CI test -- score normalized to 3",
            "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 6 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": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 6,
            "reason": "8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6",
            "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": 6,
            "reason": "dependency not pinned by hash detected -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "d8413afcccb631f5484e36090753290341917a0c",
        "ran_at": "2026-07-24T13:41:47Z",
        "aggregate_score": 4.6,
        "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-24T13:37:04Z",
      "oldest_open_prs": [
        {
          "number": 364,
          "created_at": "2025-07-14T06:23:29Z",
          "last_comment_at": "2025-07-23T05:46:53Z",
          "last_comment_author": "rmunn"
        },
        {
          "number": 369,
          "created_at": "2026-04-28T16:34:09Z",
          "last_comment_at": "2026-04-28T17:42:52Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 370,
          "created_at": "2026-04-28T16:36:18Z",
          "last_comment_at": "2026-04-28T17:50:53Z",
          "last_comment_author": "github-actions"
        },
        {
          "number": 386,
          "created_at": "2026-06-22T19:49:29Z",
          "last_comment_at": "2026-07-08T07:27:43Z",
          "last_comment_author": "hahn-kev"
        },
        {
          "number": 389,
          "created_at": "2026-07-06T09:56:48Z",
          "last_comment_at": "2026-07-23T08:02:58Z",
          "last_comment_author": "hahn-kev"
        }
      ],
      "last_merged_pr_at": "2026-07-24T12:26:25Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 178,
          "created_at": "2018-07-11T21:11:46Z",
          "last_comment_at": "2018-07-12T15:51:53Z",
          "last_comment_author": "wasta-mxb"
        },
        {
          "number": 184,
          "created_at": "2019-05-08T18:20:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 192,
          "created_at": "2019-09-26T14:42:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 193,
          "created_at": "2019-09-26T14:42:46Z",
          "last_comment_at": "2023-12-16T04:04:41Z",
          "last_comment_author": "rmunn"
        },
        {
          "number": 261,
          "created_at": "2021-09-03T02:37:55Z",
          "last_comment_at": "2026-06-22T20:54:39Z",
          "last_comment_author": "imnasnainaec"
        },
        {
          "number": 298,
          "created_at": "2022-09-22T03:57:32Z",
          "last_comment_at": "2024-10-22T04:52:28Z",
          "last_comment_author": "rmunn"
        },
        {
          "number": 299,
          "created_at": "2022-09-23T07:16:29Z",
          "last_comment_at": "2022-12-12T16:57:40Z",
          "last_comment_author": "papeh"
        },
        {
          "number": 331,
          "created_at": "2024-01-30T16:09:18Z",
          "last_comment_at": "2024-02-14T07:12:49Z",
          "last_comment_author": "Marcool04"
        },
        {
          "number": 342,
          "created_at": "2024-06-11T20:44:11Z",
          "last_comment_at": "2024-06-12T15:21:04Z",
          "last_comment_author": "hahn-kev"
        },
        {
          "number": 361,
          "created_at": "2025-07-08T03:21:37Z",
          "last_comment_at": "2025-07-14T05:53:38Z",
          "last_comment_author": "rmunn"
        },
        {
          "number": 362,
          "created_at": "2025-07-08T09:50:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 363,
          "created_at": "2025-07-14T06:20:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 371,
          "created_at": "2026-06-22T14:52:22Z",
          "last_comment_at": "2026-06-22T14:58:30Z",
          "last_comment_author": "imnasnainaec"
        },
        {
          "number": 376,
          "created_at": "2026-06-22T15:51:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 387,
          "created_at": "2026-06-22T20:27:18Z",
          "last_comment_at": "2026-06-22T20:27:37Z",
          "last_comment_author": "imnasnainaec"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/sillsdev/chorus",
    "host": "github.com",
    "name": "chorus",
    "owner": "sillsdev"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 55,
      "inputs": {
        "security": 57,
        "vitality": 46,
        "community": 38,
        "governance": 72,
        "engineering": 56
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "at_risk",
        "name": "Vitality",
        "value": 46,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "commits_last_year": 9,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 6
            },
            "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": "6/52 weeks with commits",
                "points": 4.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 6
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "9 commits in the last year",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "at_risk",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 32,
            "inputs": {
              "releases_count": 4,
              "latest_release_tag": "v5.1.0",
              "releases_from_tags": false,
              "days_since_latest_release": 1045,
              "mean_days_between_releases": 1031.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "4 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 1045 days ago",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 1045
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1031.2 days",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1031.2
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Community & Adoption",
        "value": 38,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 27,
            "inputs": {
              "forks": 26,
              "stars": 5,
              "watchers": 11,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "5 stars",
                "points": 9.8,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "26 forks",
                "points": 11.7,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 26
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "11 watchers",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 11
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "has_contributing": false,
              "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": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "good",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 73,
            "inputs": {
              "packages": [
                "SIL.Chorus.App",
                "SIL.Chorus.ChorusHub",
                "SIL.Chorus.LibChorus",
                "SIL.Chorus.ChorusMerge",
                "SIL.Chorus.ChorusHubApp",
                "SIL.Chorus.LibChorus.TestUtilities"
              ],
              "dependents": null,
              "ecosystems": "nuget",
              "total_downloads": 407351,
              "monthly_downloads": null
            },
            "components": [
              {
                "key": "total_downloads",
                "name": "Total downloads",
                "detail": "407,351 downloads all-time across nuget",
                "points": 58.3,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_total",
                    "params": {
                      "count": 407351,
                      "ecosystems": "nuget"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "good",
        "name": "Sustainability & Governance",
        "value": 72,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "good",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "bus_factor": 3,
              "contributors_sampled": 37,
              "top_contributor_share": 0.259
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "3 contributor(s) cover half of all commits",
                "points": 36,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 26% of commits",
                "points": 16.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 26
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "37 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 37
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 6 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "merged_prs": 290,
              "open_issues": 15,
              "closed_issues": 29,
              "issue_closed_ratio": 0.659,
              "closed_unmerged_prs": 50
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "66% of issues closed",
                "points": 30.8,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 66
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "290/340 decided PRs merged",
                "points": 32.6,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 290,
                      "decided": 340
                    }
                  }
                ],
                "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": "good",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 71,
            "inputs": {
              "followers": 181,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "sillsdev",
              "public_repos": 303,
              "account_age_days": 5409
            },
            "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": "181 followers of sillsdev",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 181,
                      "login": "sillsdev"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "303 public repos, account ~14 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 303
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 14
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "moderate",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "packages": [
                "SIL.Chorus.App",
                "SIL.Chorus.ChorusHub",
                "SIL.Chorus.LibChorus",
                "SIL.Chorus.ChorusMerge",
                "SIL.Chorus.ChorusHubApp",
                "SIL.Chorus.LibChorus.TestUtilities"
              ],
              "ecosystems": "nuget",
              "any_deprecated": false,
              "min_days_since_publish": 1136
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "6 package(s) on nuget",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 6,
                      "ecosystems": "nuget"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 1136 days ago",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 1136
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "3 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 56,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": true,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 6.4,
                "status": "met",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "9 out of 26 merged PRs checked by a CI test -- score normalized to 3",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [
                "chorus",
                "synchronization",
                "conflict",
                "xml",
                "merge",
                "send-receive",
                "dvcs",
                "hg",
                "fieldworks",
                "hacktoberfest"
              ],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "10 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 57,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Branch-Protection. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "branch_protection"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 46,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.6
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "binaries present in source code",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "internal error: error during branchesHandler.setup: internal error: some github tokens can't read classic branch protection rules: https://github.com/ossf/scorecard-action/blob/main/docs/authentication/fine-grained-auth-token.md",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "9 out of 26 merged PRs checked by a CI test -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "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 6 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": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6",
                "points": 4.5,
                "status": "partial",
                "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 6",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "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 21 resolved dependencies against OSV; 7 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": 21
                }
              },
              {
                "code": "advisories_unassessed",
                "params": {
                  "count": 7
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 21,
              "unassessed_packages": 7,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 21,
              "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": 3
            },
            "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": 61,
        "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.77,
              "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": "77 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 77,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.05,
              "toolchain_manifests": [
                "src/Chorus.Tests/Chorus.Tests.csproj",
                "src/Chorus/Chorus.csproj",
                "src/ChorusHub/ChorusHub.csproj",
                "src/ChorusHubApp/ChorusHubApp.csproj",
                "src/ChorusHubTests/ChorusHubTests.csproj",
                "src/ChorusMerge.Tests/ChorusMerge.Tests.csproj",
                "src/ChorusMerge/ChorusMerge.csproj",
                "src/LibChorus.TestUtilities/LibChorus.TestUtilities.csproj",
                "src/LibChorus/LibChorus.csproj",
                "src/LibChorusTests/LibChorus.Tests.csproj",
                "src/SampleApp/SampleApp.csproj",
                "src/Tests-ChorusPlugin/Tests-ChorusPlugin.csproj"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "src/Chorus.Tests/Chorus.Tests.csproj, src/Chorus/Chorus.csproj, src/ChorusHub/ChorusHub.csproj (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "src/Chorus.Tests/Chorus.Tests.csproj, src/Chorus/Chorus.csproj, src/ChorusHub/ChorusHub.csproj"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "C# (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "5 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 5,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "C#",
              "largest_source_bytes": 78425,
              "source_files_sampled": 438,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "C# (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C#"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/438 source files over 60KB",
                "points": 54.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 438,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T13:42:19.948303Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/sillsdev/chorus.svg",
  "full_name": "sillsdev/chorus",
  "license_state": "absent",
  "license_spdx": null
}

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

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

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