Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-27 02:37 UTC

torvalds / subsurface-for-dirk

Do not use - the real upstream is Subsurface-divelog/subsurface

C++ · CGPL-2.0★ 468 stars⑂ 66 forkssince Jan 2017forkView on GitHub ↗

torvalds/subsurface-for-dirk holds a health index of 34 out of 100, placing it in the At risk band. It scores highest on AI Readiness (60/100) and lowest on Vitality (17/100). It was last updated 697 days ago. 2 contributors account for most of its recent work.

34
overall / 100
At risk

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.

34
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.

Abandonment Policy applies a 85% multiplier to weighted overall health.

Ownership

Linus TorvaldsPersonal account
313,343 followers12 public repossince Sep 2011Linux Foundation

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Metrics by category

Vitality

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

17Critical · 22% of overall
How it's scored
0/36Push recency — last push 697 days ago
0/36Commit cadence — 0/52 weeks with commits
0/18Commit volume — 0 commits in the last year
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Inputs used
commits_last_year0
human_commit_share1
days_since_last_push697
active_weeks_last_year0
How it's scored
16.2/27Ships releases — 39 version tags (no GitHub releases)
0/36Release recency — latest release 3,492 days ago
19.8/27Release cadence — a release every ~50.7 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count39
latest_release_tagv4.5.97
releases_from_tagsyes
days_since_latest_release3,492
mean_days_between_releases50.7
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

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

47At risk · 18% of overall
How it's scored
43.3/60Stars — 468 stars
15.1/25Forks — 66 forks
7.1/15Watchers — 20 watchers
Inputs used
forks66
stars468
watchers20
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
0/22.5README
22.5/22.5License — recognized license (GPL-2.0)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeno
has_licenseno
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

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

45At risk · 24% of overall
How it's scored
25.2/54Bus factor — 2 contributor(s) cover half of all commits
13.6/22.5Commit distribution — top contributor authored 40% of commits
13.5/13.5Contributor breadth — 100 contributors
10/10OpenSSF Scorecard: Contributors — project has 23 contributing companies or organizations
Inputs used
bus_factor2
contributors_sampled100
top_contributor_share0.395
How it's scored
0/46.8Issue resolution — no issues or no data
0/38.3PR acceptance — 0/1 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
25/25Owner reach — 313,343 followers of torvalds
20.1/25Track record — 12 public repos, account ~14 yr old
Inputs used
followers313,343
owner_typeUser
is_verified
owner_logintorvalds
public_repos12
account_age_days5,440
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.

Engineering Quality

Are baseline engineering and documentation practices in place?

52Moderate · 20% of overall
How it's scored
24/24CI workflows — 13 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.

Documentation

40At risk
How it's scored
0/30README
25/25Documentation directory
15/15Documentation / homepage site — https://subsurface-divelog.org
0/10Repository description
0/10Topics
0/10Wiki
Inputs used
topics
has_wikino
homepagehttps://subsurface-divelog.org
has_readmeno
has_docs_diryes
has_descriptionno

Security

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

39At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — no data
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 23 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
2.5/2.5License — license file detected
0/7.5Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
0/5Packaging — no data
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
5/5SAST — SAST tool detected: CodeQL
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3.9
Excluded from scoring (no data or not applicable): ci_tests, packaging, signed_releases. Remaining weights renormalized.

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.

60Moderate · 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 — 88 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.88
agent_instruction_files
agent_instruction_max_bytes
How it's scored
18/18One-command bootstrap — Documentation/Makefile, ReleaseNotes/Makefile, makefile
22/22Automated tests
0/11Lint / format config
11/11Static type checking — C++ (statically typed)
10/10Reproducible environment — Dockerfile
0/10Demonstrated agent practice — no agent-authored commits among the last 100
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileyes
typed_languageyes
bootstrap_filesDocumentation/Makefile, ReleaseNotes/Makefile, makefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsandroid-mobile/build.gradle
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — C++ (statically typed)
51.4/55Manageable file sizes — 41/622 source files over 60KB
Inputs used
primary_languageC++
largest_source_bytes648,053
source_files_sampled622
oversized_source_files41

Key facts

468GitHub stars
100contributors
0commits, last 12 months
697days since last push
39releases
2bus factor
0open issues
Mavenpackage ecosystems

Data collection warnings

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

More detail

Star and fork history 0 ★ / 66 ⇿
0Stars
66Forks

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.

01325385063756622017-012021-062025-11

Each point covers 9 days.

OpenSSF Scorecard 3.9 / 10
3.9aggregate

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-27 02:37 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/aCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 23 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintained0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
n/aPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
10SASTSAST tool detected: CodeQL
0Security-Policysecurity policy file not detected
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
All dependencies 0

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

RegistryPackageVersionRelation
Dependency advisories not assessed

Advisory matching could not run for this report: No resolved dependencies to assess

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": true,
      "size_kb": 155337,
      "has_wiki": false,
      "homepage": "https://subsurface-divelog.org",
      "languages": {
        "C": 1205956,
        "R": 4070,
        "C++": 2736799,
        "CSS": 12885,
        "QML": 270918,
        "TeX": 19220,
        "HTML": 36487,
        "Java": 19782,
        "Perl": 19749,
        "XSLT": 291922,
        "CMake": 77145,
        "QMake": 12652,
        "Shell": 152678,
        "Makefile": 6648,
        "Dockerfile": 8499,
        "JavaScript": 41191,
        "Objective-C++": 5497
      },
      "pushed_at": "2024-08-28T08:00:07Z",
      "created_at": "2017-01-11T18:03:01Z",
      "owner_type": "User",
      "updated_at": "2026-07-25T18:32:38Z",
      "description": "Do not use - the real upstream is  Subsurface-divelog/subsurface",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "GPL-2.0",
      "default_branch": "master",
      "license_spdx_raw": "GPL-2.0",
      "primary_language": "C++",
      "significant_languages": [
        "C++",
        "C"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Linus Torvalds",
      "type": "User",
      "login": "torvalds",
      "company": "Linux Foundation",
      "location": "Portland, OR",
      "followers": 313343,
      "avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4",
      "created_at": "2011-09-03T15:26:22Z",
      "is_verified": null,
      "public_repos": 12,
      "account_age_days": 5440
    },
    "license": {
      "state": "standard",
      "spdx_id": "GPL-2.0",
      "raw_spdx": "GPL-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v4.5.97",
          "kind": "patch",
          "published_at": "2017-01-02T23:55:00Z"
        },
        {
          "tag": "v4.5.96",
          "kind": "patch",
          "published_at": "2016-12-12T03:43:55Z"
        },
        {
          "tag": "v4.5.6",
          "kind": "patch",
          "published_at": "2016-04-26T16:38:53Z"
        },
        {
          "tag": "v4.5.5",
          "kind": "patch",
          "published_at": "2016-04-09T15:33:37Z"
        },
        {
          "tag": "v4.5.4",
          "kind": "patch",
          "published_at": "2016-03-16T14:34:57Z"
        },
        {
          "tag": "v4.5.3",
          "kind": "patch",
          "published_at": "2015-12-13T19:40:16Z"
        },
        {
          "tag": "v4.5.2",
          "kind": "patch",
          "published_at": "2015-10-27T06:27:16Z"
        },
        {
          "tag": "v4.5.1",
          "kind": "patch",
          "published_at": "2015-10-27T06:27:16Z"
        },
        {
          "tag": "v4.5.0",
          "kind": "minor",
          "published_at": "2015-10-14T12:59:09Z"
        },
        {
          "tag": "v4.4.98",
          "kind": "patch",
          "published_at": "2015-10-04T15:42:27Z"
        },
        {
          "tag": "v4.4.97",
          "kind": "patch",
          "published_at": "2015-09-19T22:33:40Z"
        },
        {
          "tag": "v4.4.96",
          "kind": "patch",
          "published_at": "2015-09-03T14:40:14Z"
        },
        {
          "tag": "v4.4.2",
          "kind": "patch",
          "published_at": "2015-05-04T17:59:10Z"
        },
        {
          "tag": "v4.4.1",
          "kind": "patch",
          "published_at": "2015-02-18T19:11:03Z"
        },
        {
          "tag": "v4.4.0",
          "kind": "minor",
          "published_at": "2015-02-04T16:00:33Z"
        },
        {
          "tag": "v4.3.970",
          "kind": "patch",
          "published_at": "2015-02-01T15:24:48Z"
        },
        {
          "tag": "v4.3.960",
          "kind": "patch",
          "published_at": "2015-01-25T21:40:18Z"
        },
        {
          "tag": "v4.3.950",
          "kind": "patch",
          "published_at": "2015-01-24T02:52:26Z"
        },
        {
          "tag": "v4.2.91",
          "kind": "patch",
          "published_at": "2014-12-09T02:49:01Z"
        },
        {
          "tag": "v4.2.90",
          "kind": "patch",
          "published_at": "2014-11-17T22:27:05Z"
        },
        {
          "tag": "v4.2.1",
          "kind": "patch",
          "published_at": "2014-11-13T18:25:56Z"
        },
        {
          "tag": "v4.1.94",
          "kind": "patch",
          "published_at": "2014-08-05T22:50:14Z"
        },
        {
          "tag": "v4.1.93",
          "kind": "patch",
          "published_at": "2014-07-25T19:51:23Z"
        },
        {
          "tag": "v4.1.92",
          "kind": "patch",
          "published_at": "2014-07-24T20:53:21Z"
        },
        {
          "tag": "v4.1.91",
          "kind": "patch",
          "published_at": "2014-07-19T01:46:51Z"
        },
        {
          "tag": "v4.1.90",
          "kind": "patch",
          "published_at": "2014-07-13T04:09:32Z"
        },
        {
          "tag": "v4.0.99",
          "kind": "patch",
          "published_at": "2014-05-06T18:32:48Z"
        },
        {
          "tag": "v4.0.98",
          "kind": "patch",
          "published_at": "2014-05-02T04:30:29Z"
        },
        {
          "tag": "v4.0.97",
          "kind": "patch",
          "published_at": "2014-05-01T22:23:33Z"
        },
        {
          "tag": "v4.0.96",
          "kind": "patch",
          "published_at": "2014-04-25T14:20:33Z"
        },
        {
          "tag": "v4.0.3",
          "kind": "patch",
          "published_at": "2014-02-16T03:38:11Z"
        },
        {
          "tag": "v4.0.2",
          "kind": "patch",
          "published_at": "2014-01-09T08:09:43Z"
        },
        {
          "tag": "v4.0.1",
          "kind": "patch",
          "published_at": "2014-01-03T11:18:59Z"
        },
        {
          "tag": "v3.9.2",
          "kind": "patch",
          "published_at": "2013-12-07T06:57:39Z"
        },
        {
          "tag": "v3.9.1",
          "kind": "patch",
          "published_at": "2013-11-28T05:27:01Z"
        },
        {
          "tag": "v3.1.1",
          "kind": "patch",
          "published_at": "2013-06-30T16:47:46Z"
        },
        {
          "tag": "v3.0.2",
          "kind": "patch",
          "published_at": "2013-03-04T08:26:32Z"
        },
        {
          "tag": "v3.0.1",
          "kind": "patch",
          "published_at": "2013-02-26T21:29:23Z"
        },
        {
          "tag": "v2.0.1",
          "kind": "patch",
          "published_at": "2012-10-07T12:02:48Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "724527bc3b660a9d54aab8e4dff50430450f1643",
          "body": "fixup_dc_sample_sensors() would make sure that any pressure sensor\nindexes were in range of the cylinders by just clearing the pressure\ndata if the sensor index was larger than the number of cylinders in the\ndive.\n\nThat certainly makes the sensor index data consistent, but at the cost\nof just droppi\n[…]\n pressure data in the profile, and the git data\nwould still be the old one.\n\nUntil Dirk renumbered his dives, and the data was rewritten.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>",
          "is_bot": false,
          "headline": "Fix the dc sensor index fixup",
          "author_name": "Linus Torvalds",
          "author_login": "torvalds",
          "committed_at": "2022-09-12T20:58:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3446dd512597d538c1c1f337a85225700c965a25",
          "body": "The cylinder pressure fixup depends on the sample sensors indexes having\nbeen fixed.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>",
          "is_bot": false,
          "headline": "fix up sample sensor indexes before fixing up cylinder pressures",
          "author_name": "Linus Torvalds",
          "author_login": "torvalds",
          "committed_at": "2022-09-12T20:58:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77a5ca42340db6a19bc65c87bb640bd8aac531c4",
          "body": "Render a warning sign in front of the event string\nin the infobox. This is done in rich text.\n\nNote: This shows the warning sign for all events,\nnot just warnings.\n\nSigned-off-by: Robert C. Helling <helling@atdotde.de>",
          "is_bot": false,
          "headline": "For warnings, show icon in infobox",
          "author_name": "Robert C. Helling",
          "author_login": "atdotde",
          "committed_at": "2022-09-12T17:30:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d306ba9b38a358cc46053138a1bb7aa29c79392a",
          "body": "Add instructions for building on Raspberry Pi OS (64-bit) Released\nApril 4, 2022.\n\nSigned-off-by: Captain Junk <captainjunk@gmail.com>",
          "is_bot": false,
          "headline": "Update INSTALL",
          "author_name": "Captain Junk",
          "author_login": "captainjunk",
          "committed_at": "2022-09-03T22:49:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50d83ab188db2b26bf2059956cbedf97f447c43f",
          "body": "To give visual feedback.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "profile: show closed-hand cursor while panning",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-09-03T20:51:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edf2a2f4f43778d7573fb017ea2ca138fe86a0c3",
          "body": "When zoomed in, the profile position was moved by hovering with\nthe mouse. What a horrible user experience. This is especially\nuseless if we want to implement an interactive profile on mobile.\n\nInstead, let the user start the panning with a mouse click. The\ncode is somewhat nasty, because the positi\n[…]\nriction that the planner handles\ncan only be moved when fully zoomed out. It is not completely\nclear what the implications are. Let's see.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "profile: implement panning of profile",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-09-03T20:51:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0d92ef28355898c81bdcc0187736580e4f094b91",
          "body": "A QVariant was initialized but never used.\n\nWhile doing so, remove construct/assign pairs of a number of\nQStrings. Directly construct the QStrings with the desired\nvalues.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "cleanup: remove unused variable",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-09-03T20:49:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a7ee872f3c7bc6703773023832e333af4d8672a",
          "body": "The get_minutes() function formats a time as m:ss\nand returns a static C-string. Since all callers are\nC++ anyway and transform directly into QString, let us\nmove this to the other string formatting function.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "cleanup: move minute formating to format-string.cpp",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-09-03T20:49:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "104793719779f8aaf26e2991b8671c3b6b557235",
          "body": "Signed-off-by: Michael Andreen <michael@andreen.dev>",
          "is_bot": false,
          "headline": "user-manual: Update documentation on fixing sensor data",
          "author_name": "Michael Andreen",
          "author_login": "michaelandreen",
          "committed_at": "2022-09-03T20:38:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a39e69c497b695d0c45f63af31a1f899376b62cc",
          "body": "Also allow editing sensor on a cylinder with already attached sensor.\nThis will swap the sensor data with the cylinder that it is taking the\nsensor data from, removing the need for adding an extra temporary\ncylinder when swapping two sensors.\n\nSigned-off-by: Michael Andreen <michael@andreen.dev>",
          "is_bot": false,
          "headline": "Use combo box for moving sensor data",
          "author_name": "Michael Andreen",
          "author_login": "michaelandreen",
          "committed_at": "2022-09-03T20:38:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70e43d13a01d1639bcb0394ff8a53f207b4801f2",
          "body": "This way the github.com/subsurface/subsurface no longer shows incorrect\nbuild failures.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "cleanup: show the correct build badges",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-31T21:32:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34e169aace73fa2e3851869855818cd8e9e97216",
          "body": "The SSRF_INFO() macro is widely used, and there's a lot of confusion\nabout whether the newline at the end should be done by the SSRF_INFO or\nbe in the format string passed to it.  End result: we end up doing both,\nand there are empty lines in the output as a result.\n\nClean this up by just using our \n[…]\n()' messages, which apparently\nonly used to be showin in the red error bar on the display.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "clean up logging, and add error reports to it too",
          "author_name": "Linus Torvalds",
          "author_login": "torvalds",
          "committed_at": "2022-08-31T20:58:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42da08df20161bc533a9175fa974ed20ac3939df",
          "body": "Instead of using the save file dialog (which creates a horrendous user\nexperience - and isn't even supported on Android), simply allow the user\nto email the file in question to a recipient of their choice, e.g.,\nthemselves.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "mobile: enable sharing via email",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-31T20:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f144fa0a1b021713cc34c4840986129f4cb63fda",
          "body": "This will allow the user of the mobile app to export dive and dive site\ndata from their mobile device without using the Subsurface cloud.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "mobile: allow sharing files via email",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-31T20:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ead15f622a3891794e68bb48974f593d0e767ac5",
          "body": "The export functionality is horridly poorly implemented, and the UDDF export\nisn't actually functional on mobile. And why would we support this in the first\nplace? That's not a reasonable expectation for the mobile app.\n\nSo let's just completely remove that and good riddance.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "mobile: remove export as UDDF",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-31T20:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "173093d3148445f42ec8ff8f91e648f53b232d46",
          "body": "The comparison against the empty string caused things to error out\nwhen only one file was given.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "Android: correctly check for empty path",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-31T20:58:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6d77d814a877e72e4b9542387d339a8b61feedb4",
          "body": "Fixes #3493.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "parser: allow import of dive sites without UUID",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-31T20:56:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa4b48f440e2b5cafaadc821633b128e7e96688e",
          "body": "This were in subsurface-string.h for unknown reasons.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "core: move floating point functions to own header file",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-30T20:34:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "61701509b01e805bc262176b53982d8302a85c80",
          "body": "No reason to keep this as a macro - a function is easier to\nread, type safe and easier to debug. Moreover, give it the\nmore appropriate name \"nearly_equal()\". After all, it precisely\ndoes NOT check floating points for equality.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "core: replace IS_FP_SAME macro by inline function",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-30T20:34:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5db4a95a269da3ab85077132ce6bcc17432495b8",
          "body": "The FP_IS_SAME macro uses a relative precision to compare\nfloating points. This fails when comparing to 0. Therefore,\nuse an absolute precision in this case. Implement as an\ninline function.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "core: don't use relative precision when comparing to 0",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-30T20:34:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2ae7f3cf6c9ed1558267b9d137e6467ff5714882",
          "body": "We have two different API endpoints. supportEmail() which adds the\ndefault subject, recipient, and message body, and the generic\nshareViaEmail() which takes all of these as arguments.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "Android: make support email API consistent with iOS",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-30T18:55:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87387b7e7ed0bcf177376b3f5b02072f4e0ed096",
          "body": "This was added for Android a while ago, but now this works on iOS as well which\nis a very welcome addition for the recipient of these support emails (i.e. me).\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "mobile: send logfiles as attachments on iOS as well",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-30T16:18:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8164ca56ec6ae25fac6a8adaa0001891f2e4eded",
          "body": "This will allow us to send attachments, just like we do on Android.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "iOS: add infrastructure to natively send email",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-30T16:18:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0af410d6ced2eb19f35af1d82f08b284cf96a4ca",
          "body": "None of the tools we use work with older versions, anyway.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "iOS: update minimum iOS version to 12.0",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-30T16:18:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7801b0c28a51e8e960f854c1e24d909589a0b0f1",
          "body": "This makes it marginally easier to deal with debug builds and release builds in\nparallel. The quick builds work most of the time, but not always.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: small changes to the iOS build script",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-30T16:18:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a4689c2e68df58b3dfc54aeca513af696bc3b26",
          "body": "For Ratio dive computers we can't tell by the Bluetooth name which model it is.\nThere are BT only models and BLE only models. The failure case here was a user\non iOS (BLE only) with a BLE only dive computer which we didn't recognize\nbecause previously we returned a BT only device (which isn't suppor\n[…]\n the transport needed\nisn't available.\n\nThese days BLE is far more common, so return a BLE enabled name by default, but\ntry a BT only name just in case.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "Ratio BLE detection fix",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-30T14:20:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c644547fb7b7ae86aceba58721d8fc69dddfad0",
          "body": "For some reason the flag to exclude . and .. breaks this functionality.\nIt works just fine without that flag, so let's just remove it.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "mobile: fix reading of cache dir",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-29T02:51:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d257a623fa53161369b5b865002a2df6967d6c5a",
          "body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "mobile: update version to 3.4.7",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-29T02:51:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d87815c6907471583553f10ac51e6147b3c014f",
          "body": "Not a single use of that and if there was - it should be removed.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "cleanup: remove BOOST_FOREACH from list of foreach-macros",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-28T20:34:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3221c69653b5c97093fa04d38954ce8230f88f7",
          "body": "Last caller was removed in a6fa6cdb41.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "cleanup: remove unused function set_dive_nr_for_current_dive()",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-28T20:34:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a2b7cc924a4b6e0120112dffeeb9158f5739170",
          "body": "Other overridden functions of this class are marked as well,\nso let's do it for this function for consistency reasons.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "cleanup: mark DiveListView::selectionChanged() as overridden",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-28T20:34:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b539af4caa4a5d4821904e2cc0add40b84e10d8",
          "body": "Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "cleanup: remove include of QLineEdit in DiveListView header",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-28T20:34:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e9043a4acef6715a3bfd6c76fff35528e3f45a5",
          "body": "When there is no map support, selection of dive sites is suppressed.\nThere is no point in calculating the selected dive sites in this case.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "cleanup: extend MAP_SUPPORT block",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-28T20:34:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5be01b04ed426579aa9902b7d0c97a6b9bf80010",
          "body": "The last caller of find_cylinder_index() was removed in\n3629a87fcc. Also remove functions that where only called by\nthis function.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "cleanup: remove unused function",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-28T20:34:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70fbce46c7b754cb20053874164b577fd8975e03",
          "body": "Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "cleanup: fix typos in comments",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-28T20:34:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "acd385048ae61248c7f961318ed99b4aa627928c",
          "body": "When a dive has both real dive computers as well as at\nleast a planned version (which is just another dive\ncomputer with a special name), only use the data from\nreal dive computers for aggregate values like maxdepth,\ndive time, average depth etc in order not to have\nimagined data on the dive list, statistics etc.\n\nMacro-magic-provided-by: Dirk Hohndel <dirk@hohndel.org>\nSigned-off-by: Robert C. Helling <helling@atdotde.de>",
          "is_bot": false,
          "headline": "Prefer real data over planned",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-25T20:38:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c00f9f233afac6e270da6bc53fd9f52a5963388",
          "body": "One would think that calling free() on a dive structure, as the code\ndid in some places, would lead to a memory leak.\n\n(Insert rant about C memory management.)\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "core: use free_dive() to free dive",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-22T16:34:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "252761498a96cbf86eadbb017527d2ec8011d274",
          "body": "This is stored as uint32_t, so no reason to use the larger time_t.\nIt appears to be, after all, relative to the dive start.\n\nCoverity was complaining about the down-conversion later in the code.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "liquivision: use uint32_t for event time",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-22T16:34:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfa0c9c7354849e484b7e7caa55f62e342d810da",
          "body": "If the entries in the DiveLocationModel don't have their entries\nset as editable, the auto-completion popup turns of composition\nif such an item is highlighted (see Qt code in\n/src/widgets/itemviews/qabstractitemview.cpp), thus disabling\ncomposition of multi-key characters.\n\nTherefore, set this flag. Seems weird, but what should we do!?\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "desktop: make DiveLocationModel entries \"editable\"",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-22T16:20:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9455ca7061ef689eec507aa44c39459d63f434ed",
          "body": "This is crazy: when view() is called, the dive-site-suggestion\npopup (DiveLocationListView) clears its WA_InputMethodEnabled\nflag. This makes key composition not work as long as the\npopup is open.\n\nThus, when showing the popup, explicitly set the flag.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "desktop: set composition flag in dive site list",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-22T16:20:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "881a9cac4e8f32cc2b7c2061adedb1f4c35e6ce5",
          "body": "Replace NULL -> nullptr\nRemove spurious semicolon\n\nSigned-off-by: Michael WERLE <micha@michaelwerle.com>",
          "is_bot": false,
          "headline": "cleanup: fix compiler warnings in recently edited files.",
          "author_name": "Michael Werle",
          "author_login": "mwerle",
          "committed_at": "2022-08-22T01:53:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efb1832db802eb904f3e8b00ac96bc399a26e9f9",
          "body": "Adds a preference setting in the \"Default\" settings tab to toggle whether\nto display shortened names in the Map.\n\nTODO: instead of using the generic \"settingsChanged\" signal, it would be much\nmore efficient to only update items based on the actual setting which was\nchanged.\n\nSigned-off-by: Michael WERLE <micha@michaelwerle.com>",
          "is_bot": false,
          "headline": "Map Short Names - add preference setting",
          "author_name": "Michael Werle",
          "author_login": "mwerle",
          "committed_at": "2022-08-22T01:53:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3dbba5ae699d317013e88de7f05a8639f9f84558",
          "body": "Only the last component of the Site Name is displayed, otherwise the full\nname is displayed. Site Name components are separated using slash (/)\ncharacters.\n\nFor example, if the full dive-site name is\n\"Japan / Izu Peninsula / Atami / Chinsen-Aft\" then only \"Chinsen-Aft\" is\ndisplayed on the Map.\n\nSigned-off-by: Michael WERLE <micha@michaelwerle.com>",
          "is_bot": false,
          "headline": "Map Short Names - display shortened names on the map.",
          "author_name": "Michael Werle",
          "author_login": "mwerle",
          "committed_at": "2022-08-22T01:53:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c897edc13e4965877ae3a233b5390f4363990fd3",
          "body": "In bc3b56a9690, the import of the dive mode was simplified,\nby replacing an if-else-if chain by bit manipulations.\nHowever, the bitmask was wrong: 0b00111000 is 0x38 not 0x30,\nwhich means that \"odd\" dive modes were not recognized as such.\n\nBug found by coverity.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "parser: fix DLF import",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-20T12:31:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32bc034f4134223342b702cca1ac3055bfbf6520",
          "body": "Apple store rules require this.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "mobile: add ability to delete cloud account",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-13T21:08:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "941aaf5b65696a57cf44d19aaec4b083556ebe04",
          "body": "Attn: horrible hack!\n\nFor some reason the completion-popup does not have the\nQt::WA_InputMethodEnabled flag set. Thus, if the popup is open\ncomposition of characters breaks.\n\nTherefore, when starting completion, explicitly set the flag\non the popup.\n\nThis is 100% not how this was intended, but seems to work for\nnow.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "desktop: let tag-widget completion popup accept composition events",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-13T18:19:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "803727395b3e737cccce530f3aed4564c60a85c5",
          "body": "The TagWidgets hook into the textChanged() signal to invoke\nthe word-completer. However, that signal is also emitted for\ncomposition-keys, making composition impossible if the completer\ndecides that it should show some entries.\n\nInstead, hook into the inputMethodEvent() function, where one\ncan test \n[…]\netimes the completer\npopup steals the focus and hinders further entry.\n\nAlso, this doesn't fix the location field, which is its own class.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "desktop: improve composition on TagWidgets",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-13T18:19:37Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21eb108cfda4c0b49e6e4879107b008df5e591ab",
          "body": "Garmin: Don't require sub directories for fit files\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "update to latest libdivecomputer",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-06T21:18:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05e1294be9f4ffaf33cb32988cf6d2eac9356b17",
          "body": "The git save format is designed to be entirely line-based, where all the\ndive data is on individual lines that are independent.\n\nThat is very much by design, so that you can merge these files\nautomatically, and not worry about what it does to the context (contrast\nthis to structured files like JSON \n[…]\nt\ncomments ended up somewhere *else* than right after another text line.\n\nSo do this more important fix first.\n\nReported-by: Michael Werle\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>",
          "is_bot": false,
          "headline": "git parser: handle left-over multi-line quoted strings better",
          "author_name": "Linus Torvalds",
          "author_login": "torvalds",
          "committed_at": "2022-08-01T18:31:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d68fd2922c8978dcd929e7ece16732a8b83aa884",
          "body": "In utc_mkdate() we find the interesting statement\n        val = timestamp /= 60;\nwhich not only calculates timestamp / 60, but also overwrites\ntimestamp with the new value. However, timestamp is never used\nin the remainder of the function, because the whole point is to\nswitch to 32-bit types. Thus, replace the division-assignment\nby a simple division operator to avoid head-scratching.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "trivial: remove obscure division-assignment operator",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-08-01T18:30:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c554b5785959694c404385b088e407d172654300",
          "body": "And the way this gets bundled into an iOS app means that we have to declare\npermissions that we don't use because the SDK we use could use them. On some\nlevel I can understand that logic, but in general... this is just dumb.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "iOS: the SDK references APIs that we don't use",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-08-01T16:49:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a9359a03c9e4f0b63e91696a67acd9f133ad328",
          "body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "mobile: update version to 3.4.6",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-07-31T19:12:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05ed2e70b5fcc7ae2bbdb88f3e41103b381e5b1f",
          "body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: impish is EOL",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-07-31T19:11:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8831a364ff21f7a811a0f7923bda59f67fc6e80c",
          "body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "update list of supported dive computers",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-07-31T19:07:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "067ed39503180097630d993d5715e26807200548",
          "body": "The Qt Company apparently didn't feel the need to have the correct\ntags in all of the module directories. So this now has to manually\npick the correct SHA. What a pain.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: try to hack around Qt 5.15.3 in Jammy",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-07-31T17:26:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a6a03f89f99f70d1f0761e53facd3ac4637c641",
          "body": "Update README and move CHANGELOG to ReleaseNotes.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "prepare for 5.0.9 release",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-07-31T17:26:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec9829bbd6ec907394544998f86526c7166ed2df",
          "body": "Impish is EOL.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: move to Ubuntu Jammy",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-07-31T17:26:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e92b1a56928356fb84cd7f584662459debee46d8",
          "body": "Merge upstream changes from Jef Driesen:\n     - New dive computer support:\n        - Ratio iX3M 2\n        - Sherwood Amphos Air 2.0\n     - Cleanups and fixes\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "Update libdivecomputer",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-07-31T17:26:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd1b22a4174472d96c06b8a26152a9955aed433e",
          "body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "Latest translations from Transifex",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-07-31T17:26:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "53fa568b90df8783d5c8ce9e68986d86a6c112d6",
          "body": "pass email/pasword format warning QString to translate method\n\nSigned-off-by: Jon Massey <jon.massey@thedatalab.org>",
          "is_bot": false,
          "headline": "fix: translate email/pw warning",
          "author_name": "Jon Massey",
          "author_login": "Jongmassey",
          "committed_at": "2022-07-24T14:56:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10b4cc914983f7c82d18d1625ba895832938819a",
          "body": "State requirements for email address and\npassword format within cloud preferences UI\n\nIf email address or password entered in cloud\npreferences, raise a warning within a\nQMessageBox instead of the less-visible\nreport_error method\n\nSigned-off-by: Jon Massey <jon.massey@thedatalab.org>",
          "is_bot": false,
          "headline": "Improve UX for cloud email/password checking",
          "author_name": "Jon Massey",
          "author_login": "Jongmassey",
          "committed_at": "2022-07-24T14:56:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50ff94eb8f4d92f7c409996a70caaf26125bddd0",
          "body": "The liter symbol is written as 'ℓ'. To allow searching for\nthat, normalize unicode strings to their base letter. This\ncorresponds to the 'compatibility' mode.\n\nWe might also think about stripping diacritics.\n\nSigned-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>",
          "is_bot": false,
          "headline": "filter: normalize text of fulltext search to base letters",
          "author_name": "Berthold Stoeger",
          "author_login": "bstoeger",
          "committed_at": "2022-07-08T18:38:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bac5dbb664fa24db3465b843c58e25e936313f0",
          "body": "This should avoid build failures on platforms where we don't know if\nQtWebKit will be available or not.\n\nThe options for printing and user manual are awkward to work with. This\nall needs to be cleaned up at some point. Right.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: allow adaptive building without WebKit",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-07-07T17:19:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "21de82144a39862d42406e8c69ab13065bf266ad",
          "body": "Initial support for Shearwater Petrel 3 and Perdix 2\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "update libdivecomputer",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-14T21:18:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb1284683a7134b84d8b77213bbfab1e048bbd30",
          "body": "The code works ok falling back to just Perdix and Petrel 2, but\nit looks confusing to the user to see an incorrect name in the\nconnection drop down.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "core: add new Shearwater dive computer names",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-14T18:15:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e41d877e538db3e7a185368868461ec1c57bc730",
          "body": "This really only matters for my build automation setup, but since I\nbuild from the files in the repo... I have to push this into master.\nOtherwise my build processes stall until the builds on the COPR site\nfinish. Which isn't useful.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: don't wait for copr builds",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-14T17:46:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76985d554f1edaf3482680f360102f89991b536f",
          "body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "Latest translations from Transifex",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-14T17:38:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee708a904c4354f7847fdfa1b7e2c65f60038a3d",
          "body": "It's confusing to have the same name refer to two different models.\nUnfortunately, that's what Aqualung is doing by simply changing the\nmodel number and serial number, but not the external branding.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "core: consistent naming of the new Aqualung i200C models",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-14T17:28:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d0a4bc331c8bcf7d7d11a013eb97551d853dc057",
          "body": "Initial support for new version of Aqualung i200C\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "update to experimental libdc",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-14T16:35:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49f69947e3efbd8e082aae9945fee312882df964",
          "body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "mobile: update version to 3.4.5",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-13T03:40:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ff1683ec92fc22c4b0dceb6c75491aa83d8017f",
          "body": "At least one user has an i200C that shows a GI.... serial number and\nBLE name.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "BLE: add newer model for Aqualung i200C",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-13T03:31:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e1c04344bb5c859e2977e33ece7918237963d18",
          "body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "mobile: enable MAP_SUPPORT",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-13T03:30:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3629a87fccdccc730ef47aecb995942e0d1fc01e",
          "body": "Instead of trying to find matching cylinders, trigger on the cylinder\nnumber first and then only edit that n-th cylinder if it matches the one\nin the current dive.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "Change semantic for editing cylinders for multiple dives",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-09T23:29:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19b221d2035b9ea899b17385ff52c807e7a10cdf",
          "body": "In a sign how few people use these additional properties AND use multiple\ndive computers, this took a couple of years to get noticed... but yes, we\ndo need to merge those properties as well.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "core: add missing properties to the dive merge",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-08T20:29:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf216ec9e4e85ed9662c19d494a22aff71d6be62",
          "body": "Signed-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "Update translation source strings",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-05T23:42:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ee1a4fe1786d6cd69495a1b9aec10807dee9459",
          "body": "Add support for the Seac Screen and Action\nAdd support for the Cressi Michelangelo\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "update libdivecomputer",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-05T23:37:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0f2cdd16dcf40e9c4b0f55ec7e0678976ce63e83",
          "body": "When computing plan variations, deco can get shorter when\nstaying longer when the last step is actually already at\noff gasing depth. FRACTION forces unsiged, so this introduces\na sign aware version of FRACTION that returns a sign character\nin addition.\n\nReported-by: Patrick Naujoks <p.naujoks@me.com>\n\nSigned-off-by: Robert C. Helling <helling@atdotde.de>",
          "is_bot": false,
          "headline": "Deal with negative variation times",
          "author_name": "Robert C. Helling",
          "author_login": "atdotde",
          "committed_at": "2022-06-04T21:19:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "404365c24a357ed5ea56bf304cadde8dab38e688",
          "body": "Garmin: decode dive mode\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "update libdivecomputer",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-06-01T15:56:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "30a964c508e124340818f1ebb07d1767867e968e",
          "body": "This allows having 3m depth grid for metric users.\n\n* All original properties ( named diferently ) were renamed to three_m_based_grid everywhere to be consistent.\n* Plus other small changes requested during review.\n\nSigned-off-by: Vlad A. <elf128@gmail.com>\nSigned-off-by: Vlad A <elf128@gmail.com>",
          "is_bot": false,
          "headline": "Added option to choose between different depth grid quantization schema.",
          "author_name": "Vlad A",
          "author_login": "elf128",
          "committed_at": "2022-05-22T00:29:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15f3918171020dbf7dfb8b69c99ad4bebd3a1407",
          "body": "The extra trailing 'dot' broke the cmake build on Rawhide.\nThis also tries to give more consistent Summary and Description text for\nthe Subsurface and Subsurface-test repos on copr.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: small fixes for Fedora copr build",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-05-17T17:25:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c2f0a6f3e1fab029c0f5c952f3f1d03bef57b541",
          "body": "Garmin: Handle file names in short format\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "update libdivecomputer",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-05-14T18:09:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c1e7cd1428b69bc4506eacd92ade5252a1149d72",
          "body": "Even on platforms that don't have the new git version, yet.\nAnd using the convoluted way to create an environment variable that should\npoint to our checked out tree in the GitHub Action. The more obvious ways\nhave resulted in failed builds for obscure reasons.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: consistently mark git directories safe",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-05-14T17:28:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ead205c8c8a4d7bd005c9c957e333beeaca6989",
          "body": "This should allow us to automate builds using the Fedora infrastructure.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: initial spec file for Fedora copr build",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-05-12T18:10:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df5c715afaa05c330b0d76bd761a048595555b16",
          "body": "Not sure why I didn't include that earlier.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: work around git change in Fedora 35 build",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-05-12T18:09:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89c6015cde4d63749b263c0c44a13b860abcedc9",
          "body": "The Seac importer was getting samples based only on dive number,\nwhich was causing samples from different computers but with the\nsame dive number to become interleaved.\n\nTo correct this, the SQL statement was updated to use the\ndive_id to query for samples. The table schema uses dive_id\nas a primary\n[…]\nwhich will enforce uniqueness.\n\nAdditionally, deviceid is hashed from the the device_id string.\n\nReported-by: David Brebera <david.brebera@gmail.com>\nSigned-off-by: Jim Wobser <james.wobser@gmail.com>",
          "is_bot": false,
          "headline": "Handle Mulitple Seac Computers colliding during import",
          "author_name": "Jim Wobser",
          "author_login": "jwobser",
          "committed_at": "2022-05-12T18:07:03Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ef0a6b7beea5a648991802f4520171379edceaeb",
          "body": "Signed-off-by: Michał Sawicz <michal@sawicz.net>",
          "is_bot": false,
          "headline": "[gha] refresh linux-snap.patch",
          "author_name": "Michał Sawicz",
          "author_login": "Saviq",
          "committed_at": "2022-05-07T21:49:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c7242a37be360bb7059a7403f79b92ab173dc6b8",
          "body": "Signed-off-by: Michał Sawicz <michal@sawicz.net>",
          "is_bot": false,
          "headline": "[snap] refresh for core20 and add Wayland support",
          "author_name": "Michał Sawicz",
          "author_login": "Saviq",
          "committed_at": "2022-05-07T21:49:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34b61ad28846206f6d88d29088af9b0cc0e619b5",
          "body": "The calculation of the deco steps shown in the profile\ninfobox is somewhat independent of the planner. When\nset to imperial units, the distance between deco stops\nshould be 10ft rather than 3m as 15m is only 49ft.\n\nSigned-off-by: Robert C. Helling <helling@atdotde.de>",
          "is_bot": false,
          "headline": "Use 10ft as deco step size in imperial units in profile",
          "author_name": "Robert C. Helling",
          "author_login": "atdotde",
          "committed_at": "2022-05-06T21:17:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bdeeba4a67c2ccfcfbf3010755d57f67104f269c",
          "body": "The cylinder_with_sensor_sample() function only tests \"do we have a mapping to\nthis cylinder for this sample\". It also needs to test if there are any tank\npressure readings for that cylinder.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "core: fix detection of used cylinders",
          "author_name": "Linus Torvalds",
          "author_login": "torvalds",
          "committed_at": "2022-04-28T19:30:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51590853eb087cca47e053ea0a5ae2af3d635fcd",
          "body": "Qt5 doesn't support the m1.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: macOS universal builds imply Qt6 builds",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-04-28T05:03:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efdc525a22f9673de7a8a19c4cf75f3ab9ccead7",
          "body": "While I clearly recall that in the past the couple of cmake modules\nthat were installed when building the dependencies were found, in my\nlatest tests on macOS 12 with the latest cmake this seems to fail.\n\nThis seems like a cheap quick way to ensure that things behave as\nexpected.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "cmake: try harder to find the cmake modules we install",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-04-28T05:03:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0d819a842958feea8cd62a070a6c87d5fa3369d",
          "body": "It does seem a bit odd, but the arch command actually doesn't\nreturn a reasonable architecture on macOS. So let's use the\nuname -m command to get the right answer that makes this script\nwork both on an m1 and an Intel Mac.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: fix building fat binaries on x86_64",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-04-28T05:03:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7ea951122b47b1d881036c3e51edfb594432a58",
          "body": "And tiny whitespace fixes.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "update INSTALL instructions for macOS",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-04-28T05:03:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a73fd0ed60fef8c8969a18647b06f430742d5e54",
          "body": "I'm not sure why these headers are needed here and nowhere else...\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "cleanup: compile fix for latest Xcode",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-04-28T05:03:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8d9730f74f1071851f734f5014e297519792e058",
          "body": "Arguably every dive should at least have one cylinder, but an imported\ndive from divelogs.de might end up without one. Sadly, that breaks\nassumptions that we make in the cylinder remapping.\n\nTo work around it, force at least on cylinder to be assumed in the merge\ncode.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "core: avoid crash when merging dive with no cylinders",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-04-24T15:00:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a5188bc470dacb00d5ee754f7f2e07043f03196",
          "body": "As some Linux distros start to ship both Qt5 and Qt6, it actually makes more\nsense to build only against Qt6 when the user explicitly asks for it. Having it\npreferred over Qt5 seems completely wrong in hind sight.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: don't build against Qt6 by default",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-04-23T19:35:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36c991a1b8bac30c2677bb438a8f345aca351d4d",
          "body": "The git ownership issue strikes again.\n\nSigned-off-by: Dirk Hohndel <dirk@hohndel.org>",
          "is_bot": false,
          "headline": "build-system: work around git change in coverity build",
          "author_name": "Dirk Hohndel",
          "author_login": "dirkhh",
          "committed_at": "2022-04-22T19:32:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dee13bf4103a09eee39c7cc9a5c2b4f33dc03178",
          "body": ".. at least if the local repository exists and can be opened.\n\nIf the local repo cannot be directly opened, we will still try to sync\nwith the remote first, but this way the *common* git save situation is\nthat we save locally before we then try to sync with the remote.\n\nThat means that if we have network problems, the save will happen before\nwe possibly hang due to really really slow networking.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>",
          "is_bot": false,
          "headline": "git access: save to local repository before doing remote access",
          "author_name": "Linus Torvalds",
          "author_login": "torvalds",
          "committed_at": "2022-04-22T15:28:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e33680c3363b186347df2ccb1fb8930c34e9e247",
          "body": "We had various random \"free parts of the git info\" left-overs from when\nwe passed down the git repo data ad-hoc.  Get rid of it, and replace it\nwith just doing a 'cleanup_git_info()' that does the final cleanup of it\nall.\n\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>",
          "is_bot": false,
          "headline": "git access: add proper cleanup function for git_info",
          "author_name": "Linus Torvalds",
          "author_login": "torvalds",
          "committed_at": "2022-04-22T15:28:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96337dbbcf868a19b4b67ae98d066f55967463b3",
          "body": "That function name was incomprehensible.  What did it check? And what\ndid the return value mean?\n\nSo let's rename it to something that actually describes what it does,\nand reverse the meaning of the return value while at it.\n\nSo now it's called 'remote_repo_uptodate()', and it returns true if the\nre\n[…]\nbut maybe we could come up with even better semantics and naming, and\nmake it even clearer.\n\nRequested-by: Dirk Hohndel <dirk@hohndel.org>\nSigned-off-by: Linus Torvalds <torvalds@linux-foundation.org>",
          "is_bot": false,
          "headline": "git access: rename 'check_git_sha()' function",
          "author_name": "Linus Torvalds",
          "author_login": "torvalds",
          "committed_at": "2022-04-22T15:28:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 39,
      "commits_last_year": 0,
      "latest_release_at": "2017-01-02T23:55:00Z",
      "latest_release_tag": "v4.5.97",
      "releases_from_tags": true,
      "days_since_last_push": 697,
      "active_weeks_last_year": 0,
      "days_since_latest_release": 3492,
      "mean_days_between_releases": 50.7
    },
    "community": {
      "has_readme": false,
      "has_license": false,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": null,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": []
    },
    "popularity": {
      "forks": 66,
      "stars": 468,
      "watchers": 20,
      "fork_history": {
        "days": [
          {
            "date": "2017-01-13",
            "count": 1
          },
          {
            "date": "2017-01-22",
            "count": 1
          },
          {
            "date": "2017-01-26",
            "count": 1
          },
          {
            "date": "2017-01-31",
            "count": 1
          },
          {
            "date": "2017-03-02",
            "count": 1
          },
          {
            "date": "2017-04-02",
            "count": 1
          },
          {
            "date": "2017-04-03",
            "count": 1
          },
          {
            "date": "2017-04-24",
            "count": 1
          },
          {
            "date": "2017-05-14",
            "count": 1
          },
          {
            "date": "2017-08-15",
            "count": 1
          },
          {
            "date": "2017-08-23",
            "count": 1
          },
          {
            "date": "2018-01-29",
            "count": 1
          },
          {
            "date": "2018-03-01",
            "count": 1
          },
          {
            "date": "2018-07-07",
            "count": 1
          },
          {
            "date": "2018-10-25",
            "count": 1
          },
          {
            "date": "2019-02-18",
            "count": 1
          },
          {
            "date": "2019-02-20",
            "count": 1
          },
          {
            "date": "2019-03-08",
            "count": 1
          },
          {
            "date": "2019-04-17",
            "count": 1
          },
          {
            "date": "2019-04-24",
            "count": 1
          },
          {
            "date": "2019-05-19",
            "count": 1
          },
          {
            "date": "2019-06-26",
            "count": 1
          },
          {
            "date": "2019-08-15",
            "count": 1
          },
          {
            "date": "2019-09-21",
            "count": 1
          },
          {
            "date": "2020-01-05",
            "count": 1
          },
          {
            "date": "2020-03-11",
            "count": 1
          },
          {
            "date": "2020-03-25",
            "count": 1
          },
          {
            "date": "2020-06-26",
            "count": 1
          },
          {
            "date": "2020-07-04",
            "count": 1
          },
          {
            "date": "2020-07-23",
            "count": 1
          },
          {
            "date": "2020-11-16",
            "count": 1
          },
          {
            "date": "2021-01-04",
            "count": 1
          },
          {
            "date": "2021-01-06",
            "count": 1
          },
          {
            "date": "2021-06-10",
            "count": 1
          },
          {
            "date": "2021-07-11",
            "count": 1
          },
          {
            "date": "2021-07-20",
            "count": 1
          },
          {
            "date": "2021-08-17",
            "count": 1
          },
          {
            "date": "2021-08-23",
            "count": 1
          },
          {
            "date": "2021-09-17",
            "count": 1
          },
          {
            "date": "2021-09-19",
            "count": 1
          },
          {
            "date": "2021-10-16",
            "count": 1
          },
          {
            "date": "2021-11-11",
            "count": 1
          },
          {
            "date": "2022-02-20",
            "count": 1
          },
          {
            "date": "2022-07-04",
            "count": 1
          },
          {
            "date": "2022-08-20",
            "count": 1
          },
          {
            "date": "2022-09-01",
            "count": 1
          },
          {
            "date": "2022-10-29",
            "count": 1
          },
          {
            "date": "2023-02-06",
            "count": 1
          },
          {
            "date": "2023-02-22",
            "count": 1
          },
          {
            "date": "2023-03-19",
            "count": 1
          },
          {
            "date": "2023-04-26",
            "count": 2
          },
          {
            "date": "2023-05-23",
            "count": 1
          },
          {
            "date": "2023-06-09",
            "count": 1
          },
          {
            "date": "2024-01-25",
            "count": 1
          },
          {
            "date": "2024-02-14",
            "count": 1
          },
          {
            "date": "2024-03-03",
            "count": 1
          },
          {
            "date": "2024-06-28",
            "count": 1
          },
          {
            "date": "2024-08-02",
            "count": 1
          },
          {
            "date": "2024-09-28",
            "count": 1
          },
          {
            "date": "2024-11-10",
            "count": 2
          },
          {
            "date": "2025-03-03",
            "count": 1
          },
          {
            "date": "2025-06-29",
            "count": 1
          },
          {
            "date": "2025-07-08",
            "count": 1
          },
          {
            "date": "2025-11-09",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 66,
        "total_forks": 66
      },
      "star_history": null,
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Documentation/Makefile",
        "ReleaseNotes/Makefile",
        "makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "android-mobile/build.gradle"
      ],
      "largest_source_bytes": 648053,
      "source_files_sampled": 622,
      "oversized_source_files": 41,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "android-mobile/build.gradle"
      ],
      "advisories": {
        "error": "No resolved dependencies to assess",
        "scope": "repository_graph",
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "maven"
      ],
      "dependencies": [],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [],
        "collected": true,
        "truncated": false,
        "total_count": 0,
        "direct_count": 0,
        "indirect_count": 0
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 2,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 2,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "dirkhh",
          "commits": 6811,
          "avatar_url": "https://avatars.githubusercontent.com/u/237471?v=4"
        },
        {
          "type": "User",
          "login": "bstoeger",
          "commits": 2380,
          "avatar_url": "https://avatars.githubusercontent.com/u/32835590?v=4"
        },
        {
          "type": "User",
          "login": "mturkia",
          "commits": 1032,
          "avatar_url": "https://avatars.githubusercontent.com/u/2674500?v=4"
        },
        {
          "type": "User",
          "login": "torvalds",
          "commits": 1007,
          "avatar_url": "https://avatars.githubusercontent.com/u/1024025?v=4"
        },
        {
          "type": "User",
          "login": "neolit123",
          "commits": 810,
          "avatar_url": "https://avatars.githubusercontent.com/u/331852?v=4"
        },
        {
          "type": "User",
          "login": "janiversen",
          "commits": 673,
          "avatar_url": "https://avatars.githubusercontent.com/u/6185391?v=4"
        },
        {
          "type": "User",
          "login": "glance-",
          "commits": 633,
          "avatar_url": "https://avatars.githubusercontent.com/u/1290022?v=4"
        },
        {
          "type": "User",
          "login": "atdotde",
          "commits": 611,
          "avatar_url": "https://avatars.githubusercontent.com/u/863957?v=4"
        },
        {
          "type": "User",
          "login": "janmulder",
          "commits": 438,
          "avatar_url": "https://avatars.githubusercontent.com/u/12073956?v=4"
        },
        {
          "type": "User",
          "login": "willemferguson",
          "commits": 295,
          "avatar_url": "https://avatars.githubusercontent.com/u/5078706?v=4"
        }
      ],
      "contributors_sampled": 100,
      "top_contributor_share": 0.395
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "android.yml",
        "codeql-analysis.yml",
        "coverity-scan.yml",
        "ios.yml",
        "linux-bionic-5.9.yml",
        "linux-fedora-qt6.yml",
        "linux-focal-5.12.yml",
        "linux-jammy-5.15.yml",
        "linux-snap.yml",
        "linux-trusty-5.12.yml",
        "mac.yml",
        "snap_usns.yml",
        "windows.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "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": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 23 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": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 10,
            "reason": "SAST tool detected: CodeQL",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 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": "724527bc3b660a9d54aab8e4dff50430450f1643",
        "ran_at": "2026-07-27T02:37:03Z",
        "aggregate_score": 3.9,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": true,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": null,
      "oldest_open_prs": [
        {
          "number": 15,
          "created_at": "2022-08-20T04:29:07Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 17,
          "created_at": "2025-11-09T10:11:42Z",
          "last_comment_at": "2025-12-25T17:39:40Z",
          "last_comment_author": "EnderNon"
        }
      ],
      "last_merged_pr_at": null,
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/torvalds/subsurface-for-dirk",
    "host": "github.com",
    "name": "subsurface-for-dirk",
    "owner": "torvalds"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": "Abandonment Policy applies a 85% multiplier to weighted overall health.",
      "notes": [
        {
          "code": "abandonment_overall_adjustment",
          "params": {
            "cap": 0,
            "pct": 85
          }
        }
      ],
      "value": 34,
      "inputs": {
        "security": 39,
        "vitality": 17,
        "community": 47,
        "governance": 45,
        "engineering": 52,
        "abandonment_cap": null,
        "abandonment_state": "at_risk",
        "abandonment_multiplier": 85,
        "weighted_overall_before_abandonment": 40,
        "overall_after_abandonment_multiplier": 34
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "critical",
        "name": "Vitality",
        "value": 17,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "critical",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "commits_last_year": 0,
              "human_commit_share": 1,
              "days_since_last_push": 697,
              "active_weeks_last_year": 0
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 697 days ago",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 697
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "0/52 weeks with commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "0 commits in the last year",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "at_risk",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 40,
            "inputs": {
              "releases_count": 39,
              "latest_release_tag": "v4.5.97",
              "releases_from_tags": true,
              "days_since_latest_release": 3492,
              "mean_days_between_releases": 50.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "39 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 39
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 3492 days ago",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 3492
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~50.7 days",
                "points": 19.8,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 50.7
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "cap": null,
              "state": "at_risk",
              "guards": [],
              "signals": [
                "release_stall",
                "scorecard_unmaintained"
              ],
              "red_flag": true,
              "multiplier_pct": 85,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": 2,
              "unanswered_open_issues": 0,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 1413,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "no human commit for 1413 days; 2 unmet obligation(s): releases stalled, Scorecard reports it unmaintained",
                "points": 85,
                "status": "partial",
                "details": [
                  {
                    "code": "abandonment_flagged",
                    "params": {
                      "days": 1413,
                      "count": 2,
                      "signals": "releases stalled, Scorecard reports it unmaintained"
                    }
                  }
                ],
                "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": 47,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "forks": 66,
              "stars": 468,
              "watchers": 20,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "468 stars",
                "points": 43.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 468
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "66 forks",
                "points": 15.1,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 66
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "20 watchers",
                "points": 7.1,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "critical",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (GPL-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "GPL-2.0"
                    }
                  }
                ],
                "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 45,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "moderate",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 62,
            "inputs": {
              "bus_factor": 2,
              "contributors_sampled": 100,
              "top_contributor_share": 0.395
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "2 contributor(s) cover half of all commits",
                "points": 25.2,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 40% of commits",
                "points": 13.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 40
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "100 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 23 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "0/1 decided PRs merged",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 0,
                      "decided": 1
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 69,
            "inputs": {
              "followers": 313343,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "torvalds",
              "public_repos": 12,
              "account_age_days": 5440
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "313,343 followers of torvalds",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 313343,
                      "login": "torvalds"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "12 public repos, account ~14 yr old",
                "points": 20.1,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 12
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 14
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 52,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "13 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 13
                    }
                  }
                ],
                "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": "https://subsurface-divelog.org",
              "has_readme": false,
              "has_docs_dir": true,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://subsurface-divelog.org",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 39,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 39,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3.9
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 23 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 detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool detected: CodeQL",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 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": "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": 9
            },
            "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": 60,
        "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.88,
              "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": "88 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 88,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Documentation/Makefile",
                "ReleaseNotes/Makefile",
                "makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "android-mobile/build.gradle"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Documentation/Makefile, ReleaseNotes/Makefile, makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Documentation/Makefile, ReleaseNotes/Makefile, makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "C++ (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "C++"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 96,
            "inputs": {
              "primary_language": "C++",
              "largest_source_bytes": 648053,
              "source_files_sampled": 622,
              "oversized_source_files": 41
            },
            "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": "41/622 source files over 60KB",
                "points": 51.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 622,
                      "oversized": 41
                    }
                  }
                ],
                "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",
    "Community profile unavailable"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-27T02:37:21.637711Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/torvalds/subsurface-for-dirk.svg",
  "full_name": "torvalds/subsurface-for-dirk",
  "license_state": "standard",
  "license_spdx": "GPL-2.0"
}

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 statistics.