Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 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 зірок⑂ 66 форківз січ. 2017 р.форкПереглянути на GitHub ↗

torvalds/subsurface-for-dirk має індекс здоров’я 34 зі 100, що відповідає смузі «У зоні ризику». Найвищий показник — AI Readiness (60/100), найнижчий — Vitality (17/100). Останнє оновлення було 697 днів тому. Більшість нещодавньої роботи виконують 2 учасники.

34
загалом / 100
У зоні ризику

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

34
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

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

Власність

Linus TorvaldsОсобистий обліковий запис
313 343 підписники12 публічних репозиторіївз вер. 2011 р.Linux Foundation

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

17Критичний · 22% загального індексу
Як обчислюється оцінка
0/36Свіжість push — останній push 697 дн. тому
0/36Ритм комітів — 0/52 тижнів із комітами
0/18Обсяг комітів — 0 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Використані вхідні дані
commits_last_year0
human_commit_share1
days_since_last_push697
active_weeks_last_year0

Дисципліна релізів

40У зоні ризику
Як обчислюється оцінка
16.2/27Випускає релізи — 39 тегів версій (без релізів GitHub)
0/36Свіжість релізів — останній реліз 3 492 дн. тому
19.8/27Ритм релізів — реліз кожні ~50,7 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count39
latest_release_tagv4.5.97
releases_from_tagsтак
days_since_latest_release3 492
mean_days_between_releases50,7
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

47У зоні ризику · 18% загального індексу
Як обчислюється оцінка
43.3/60Зірки — 468 зірок
15.1/25Форки — 66 форків
7.1/15Спостерігачі — 20 спостерігачів
Використані вхідні дані
forks66
stars468
watchers20
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
0/22.5README
22.5/22.5Ліцензія — визнана ліцензія (GPL-2.0)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeні
has_licenseні
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

45У зоні ризику · 24% загального індексу
Як обчислюється оцінка
25.2/54Бас-фактор — на 2 контриб’ютор(ів) припадає половина всіх комітів
13.6/22.5Розподіл комітів — головний контриб’ютор — автор 40% комітів
13.5/13.5Широта контриб’юторів — 100 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 23 contributing companies or organizations
Використані вхідні дані
bus_factor2
contributors_sampled100
top_contributor_share0,395
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
0/38.3Прийняття PR — злито 0/1 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs1
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue. Залишкові ваги перенормовано.
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
25/25Охоплення власника — 313 343 підписників у torvalds
20.1/25Послужний список — 12 публічних репозиторіїв, вік облікового запису ~14 р.
Використані вхідні дані
followers313 343
owner_typeUser
is_verified
owner_logintorvalds
public_repos12
account_age_days5 440
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Інженерна якість

Чи наявні базові інженерні практики та документація?

52Помірний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 13 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — немає даних
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: CI-Tests. Залишкові ваги перенормовано.

Документація

40У зоні ризику
Як обчислюється оцінка
0/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://subsurface-divelog.org
0/10Опис репозиторію
0/10Теми
0/10Wiki
Використані вхідні дані
topics
has_wikiні
homepagehttps://subsurface-divelog.org
has_readmeні
has_docs_dirтак
has_descriptionні

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

39У зоні ризику · 16% загального індексу

Стан безпеки

39У зоні ризику
Як обчислюється оцінка
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 — немає даних
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.5Ліцензія — 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 — немає даних
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 — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3,9
Виключено з оцінювання (немає даних або не застосовно): ci_tests, packaging, signed_releases. Залишкові ваги перенормовано.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

60Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 88 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,88
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
18/18Розгортання однією командою — Documentation/Makefile, ReleaseNotes/Makefile, makefile
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — C++ (статично типізована)
10/10Відтворюване середовище — Dockerfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfiles
has_dockerfileтак
typed_languageтак
bootstrap_filesDocumentation/Makefile, ReleaseNotes/Makefile, makefile
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0
toolchain_manifestsandroid-mobile/build.gradle
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — C++ (статично типізована)
51.4/55Керовані розміри файлів — 41/622 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageC++
largest_source_bytes648 053
source_files_sampled622
oversized_source_files41

Ключові факти

468зірок GitHub
100контриб'юторів
0комітів за останні 12 місяців
697днів від останнього пушу
39релізів
2бас-фактор
0відкритих issue
Mavenпакетних екосистем

Попередження щодо збору даних

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

Докладніше

Історія зірок і форків 0 ★ / 66 ⇿
0Зірки
66Форки

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

01325385063756622017-012021-062025-11

Кожна точка охоплює 9 днів.

OpenSSF Scorecard 3.9 / 10
3.9сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).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
н/дCI-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
н/дPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
10SASTSAST tool detected: CodeQL
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Усі залежності 0

Повний розв'язаний набір залежностей із графа залежностей GitHub: 0 прямих і 0 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
Сповіщення про залежності не оцінено

Звірка сповіщень не відбулася для цього звіту: No resolved dependencies to assess

Звіт у форматі JSON машиночитний
{
  "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"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистика.