Public record
Software health reportschema 0.27.0 · metrics 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#No license detected★ 5 stars⑂ 26 forkssince Nov 2013View on GitHub ↗

sillsdev/chorus holds a health index of 55 out of 100, placing it in the Moderate band. It scores highest on Sustainability & Governance (72/100) and lowest on Community & Adoption (38/100). It was last updated today. 3 contributors account for most of its recent work.

55
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

55
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

SIL LSDevOrganization
181 followers303 public repossince Oct 2011

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
NuGetSIL.Chorus.App5.1.0-31136 days ago
NuGetSIL.Chorus.ChorusHub5.1.0-31136 days ago
NuGetSIL.Chorus.LibChorus5.1.0-31136 days ago
NuGetSIL.Chorus.ChorusMerge5.1.0-31136 days ago
NuGetSIL.Chorus.ChorusHubApp5.1.0-31136 days ago
NuGetSIL.Chorus.LibChorus.TestUtilities5.1.0-31136 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

46At risk · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
4.2/36Commit cadence — 6/52 weeks with commits
9/18Commit volume — 9 commits in the last year
6/10OpenSSF Scorecard: Maintained — 8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6
Inputs used
commits_last_year9
human_commit_share1
days_since_last_push0
active_weeks_last_year6
How it's scored
27/27Ships releases — 4 releases published
0/36Release recency — latest release 1,045 days ago
5.4/27Release cadence — a release every ~1,031.2 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count4
latest_release_tagv5.1.0
releases_from_tagsno
days_since_latest_release1,045
mean_days_between_releases1,031.2

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

38At risk · 18% of overall
How it's scored
9.8/60Stars — 5 stars
11.7/25Forks — 26 forks
5.6/15Watchers — 11 watchers
Inputs used
forks26
stars5
watchers11
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
0/22.5License — no license file detected
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
How it's scored
58.3/80Total downloads — 407,351 downloads all-time across nuget
0/20Registry dependents — not reported by this ecosystem
Inputs used
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
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

72Good · 24% of overall
How it's scored
36/54Bus factor — 3 contributor(s) cover half of all commits
16.7/22.5Commit distribution — top contributor authored 26% of commits
13.5/13.5Contributor breadth — 37 contributors
10/10OpenSSF Scorecard: Contributors — project has 6 contributing companies or organizations
Inputs used
bus_factor3
contributors_sampled37
top_contributor_share0.259
How it's scored
30.8/46.8Issue resolution — 66% of issues closed
32.6/38.3PR acceptance — 290/340 decided PRs merged
15/15OpenSSF Scorecard: Code-Review — all changesets reviewed
Inputs used
merged_prs290
open_issues15
closed_issues29
issue_closed_ratio0.659
closed_unmerged_prs50
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
16.2/25Owner reach — 181 followers of sillsdev
25/25Track record — 303 public repos, account ~14 yr old
Inputs used
followers181
owner_typeOrganization
is_verified
owner_loginsillsdev
public_repos303
account_age_days5,409
How it's scored
25/25Published & resolvable — 6 package(s) on nuget
4/35Publish recency — latest publish 1,136 days ago
12/20Version history — 3 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesSIL.Chorus.App, SIL.Chorus.ChorusHub, SIL.Chorus.LibChorus, SIL.Chorus.ChorusMerge, SIL.Chorus.ChorusHubApp, SIL.Chorus.LibChorus.TestUtilities
ecosystemsnuget
any_deprecatedno
min_days_since_publish1,136

Engineering Quality

Are baseline engineering and documentation practices in place?

56Moderate · 20% of overall
How it's scored
24/24CI workflows — 4 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
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
Inputs used
has_ciyes
has_testsyes
has_editorconfigyes
has_linter_configno
has_precommit_configno

Documentation

50Moderate
How it's scored
30/30README
0/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 10 topics
0/10Wiki
Inputs used
topicschorus, synchronization, conflict, xml, merge, send-receive, dvcs, hg, fieldworks, hacktoberfest
has_wikino
homepage
has_readmeyes
has_docs_dirno
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

57Moderate · 16% of overall
How it's scored
4.5/7.5Binary-Artifacts — binaries present in source code
0/7.5Branch-Protection — no data
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.5License — 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
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.6
Excluded from scoring (no data or not applicable): branch_protection. Remaining weights renormalized.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
0/25Indirect dependencies free of known advisories — transitive set not separable from development and test dependencies in this scope
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages21
unassessed_packages7
affected_by_severitynone
direct_affected_packages0
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.

AI Readiness

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.

61Moderate · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 77 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.77
agent_instruction_files
agent_instruction_max_bytes
How it's scored
12.6/18One-command bootstrap — src/Chorus.Tests/Chorus.Tests.csproj, src/Chorus/Chorus.csproj, src/ChorusHub/ChorusHub.csproj (toolchain convention, no task runner)
22/22Automated tests
0/11Lint / format config
11/11Static type checking — C# (statically typed)
0/10Reproducible environment
10/10Demonstrated agent practice — 5 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
6/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 6
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
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
How it's scored
45/45Type-checkable code — C# (statically typed)
54.9/55Manageable file sizes — 1/438 source files over 60KB
Inputs used
primary_languageC#
largest_source_bytes78,425
source_files_sampled438
oversized_source_files1

Key facts

5GitHub stars
37contributors
9commits, last 12 months
0days since last push
4releases
3bus factor
15open issues
package ecosystems

Data collection warnings

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

More detail

Star and fork history 0 ★ / 26 ⇿
0Stars
26Forks
4Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

0510152025302622014-042019-052024-06
Major 2Minor 1Patch 0

Each point covers 10 days.

OpenSSF Scorecard 4.6 / 10
4.6aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-24 13:41 UTC

6Binary-Artifactsbinaries present in source code
n/aBranch-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
Direct dependencies 73
RegistryPackageVersion constraintManifest
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
All dependencies 28

Full resolved dependency set from the GitHub dependency graph: 28 direct and 0 indirect (transitive) packages. The transitive closure is complete when the repository commits a lockfile.

RegistryPackageVersionRelation
NuGetAutofac4.9.4direct
NuGetGitVersion.MsBuild5.10.3direct
NuGeticu.net3.0.1direct
NuGetIcu4c.Win.Min59.1.7direct
NuGetL10NSharpdirect
NuGetMicrosoft.NET.Test.Sdk17.14.1direct
NuGetMicrosoft.SourceLink.GitHub1.1.1direct
NuGetNDesk.DBus0.15.0direct
NuGetNewtonsoft.Json13.0.4direct
NuGetNUnit3.13.3direct
NuGetNUnit3TestAdapter4.3.2direct
NuGetSharpZipLib1.3.3direct
NuGetSIL.BuildTasks3.0.0direct
NuGetSIL.Chorus.Mercurialdirect
NuGetSIL.Coredirect
NuGetSIL.Liftdirect
NuGetSIL.ReleaseTasks3.0.0direct
NuGetSIL.TestUtilitiesdirect
NuGetSIL.Windows.Formsdirect
NuGetSIL.WritingSystems.Testsdirect
NuGetSystem.ComponentModel.Composition6.0.0direct
NuGetSystem.Diagnostics.DiagnosticSource9.0.2direct
NuGetSystem.IO.FileSystem.Primitives4.3.0direct
NuGetSystem.Resources.Extensions6.0.0direct
NuGetSystem.Runtime.InteropServices.RuntimeInformation4.3.0direct
NuGetSystem.ServiceModel.Primitives4.8.1direct
NuGetSystem.Text.Encoding.CodePages4.0.1direct
NuGetVulcan.Uczniowie.HelpProvider1.0.16direct
Dependency advisories 0

This repository publishes no package the index resolves, so its own dependency graph was assessed — 21 packages, which also include development and test pins that never ship: 0 carry known advisories, of which 0 are direct. 7 could not be assessed — no resolved version, an unsupported ecosystem, or beyond the reported package list.

No known advisories affect the assessed dependencies.

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "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
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsNuGet.