Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.26.0 · метрики 1.13.0 · 2026-07-22 00:35 UTC

stefankroes / ancestry

Organise ActiveRecord model into a tree structure

RubyMIT★ 3 878 зірок⑂ 472 форкиз жовт. 2009 р.Переглянути на GitHub ↗

stefankroes/ancestry має індекс здоров’я 67 зі 100, що відповідає смузі «Помірний». Найвищий показник — Community & Adoption (86/100), найнижчий — AI Readiness (48/100). Останнє оновлення було 26 днів тому. Більшість нещодавньої роботи виконує один учасник.

67
загалом / 100
Помірний

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

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

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

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

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

Власність

Stefan KroesОсобистий обліковий запис
40 підписників3 публічні репозиторіїз груд. 2008 р.Booking Experts

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

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
RubyGemsancestry5.1.0-38135 днів тому

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

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

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

67Помірний · 22% загального індексу
Як обчислюється оцінка
28.8/36Свіжість push — останній push 26 дн. тому
13.8/36Ритм комітів — 20/52 тижнів із комітами
18/18Обсяг комітів — 145 комітів за останній рік
9/10OpenSSF Scorecard: Maintained — 8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9
Використані вхідні дані
commits_last_year145
human_commit_share0,99
days_since_last_push26
active_weeks_last_year20
Як обчислюється оцінка
16.2/27Випускає релізи — 28 тегів версій (без релізів GitHub)
27/36Свіжість релізів — останній реліз 135 дн. тому
12.6/27Ритм релізів — реліз кожні ~221,3 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count28
latest_release_tagv5.1.0
releases_from_tagsтак
days_since_latest_release135
mean_days_between_releases221,3
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

86Відмінний · 18% загального індексу
Як обчислюється оцінка
58.2/60Зірки — 3 878 зірок
22.3/25Форки — 472 форків
9.1/15Спостерігачі — 45 спостерігачів
Використані вхідні дані
forks472
stars3 878
watchers45
growth_stateorganic
growth_factor_pct100
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
13.5/13.5Кодекс поведінки
0/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductтак
has_pull_request_templateтак
Як обчислюється оцінка
78.8/80Сумарні завантаження — 38 034 866 завантажень за весь час у rubygems
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packagesancestry
dependents
ecosystemsrubygems
total_downloads38 034 866
monthly_downloads
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

62Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
6.6/22.5Розподіл комітів — головний контриб’ютор — автор 71% комітів
13.5/13.5Широта контриб’юторів — 99 контриб’юторів
10/10OpenSSF Scorecard: Contributors — project has 13 contributing companies or organizations
Використані вхідні дані
bus_factor1
contributors_sampled99
top_contributor_share0,708
Як обчислюється оцінка
43.8/46.8Вирішення issue — закрито 94% issue
30.3/38.3Прийняття PR — злито 323/408 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 1/12 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs323
open_issues22
closed_issues323
issue_closed_ratio0,936
closed_unmerged_prs85

Власність та опіка

48У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
11.6/25Охоплення власника — 40 підписників у stefankroes
16.4/25Послужний список — 3 публічних репозиторіїв, вік облікового запису ~17 р.
Використані вхідні дані
followers40
owner_typeUser
is_verified
owner_loginstefankroes
public_repos3
account_age_days6 440
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у rubygems
35/35Свіжість публікацій — остання публікація 135 дн. тому
20/20Історія версій — 38 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesancestry
ecosystemsrubygems
any_deprecatedні
min_days_since_publish135

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

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

69Помірний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 1 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — .rubocop.yml
0/9.6Pre-commit-хуки
0/6.4.editorconfig
18/20OpenSSF Scorecard: CI-Tests — 12 out of 13 merged PRs checked by a CI test -- score normalized to 9
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configтак
has_precommit_configні

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

50Помірний
Як обчислюється оцінка
30/30README
0/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
0/10Теми
10/10Wiki
Використані вхідні дані
topics
has_wikiтак
homepage
has_readmeтак
has_docs_dirні
has_descriptionтак

Безпека

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

50Помірний · 16% загального індексу

Стан безпеки

50Помірний
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.2/2.5CI-Tests — 12 out of 13 merged PRs checked by a CI test -- score normalized to 9
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/12 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 13 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
6.8/7.5Maintained — 8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9
0/5Packaging — немає даних
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate5
Виключено з оцінювання (немає даних або не застосовно): packaging, signed_releases. Залишкові ваги перенормовано.

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

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

48У зоні ризику · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 82 з 99 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,828
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
0/18Розгортання однією командою
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — .rubocop.yml
0/11Статична перевірка типів
0/10Відтворюване середовище
10/10Підтверджена практика роботи з агентами — 34 з останніх 100 комітів створено агентом або з його зазначенням
8/8Автоматизоване супроводження — 1 з останніх 100 комітів — автоматичні оновлення залежностей
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_files
has_devcontainerні
has_linter_configтак
typecheck_configs
agent_commit_share0,34
toolchain_manifests
dependency_bot_commit_share0,01
Як обчислюється оцінка
0/45Типізований код — Ruby без конфігурації перевірки типів
55/55Керовані розміри файлів — 0/49 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageRuby
largest_source_bytes20 293
source_files_sampled49
oversized_source_files0

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

3 878зірок GitHub
99контриб'юторів
145комітів за останні 12 місяців
26днів від останнього пушу
28релізів
1бас-фактор
22відкритих issue
RubyGemsпакетних екосистем

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

  • No resolved dependencies carried a version and a supported ecosystem

Докладніше

Історія зірок і форків 3 878 ★ / 472 ⇿
3 878Зірки
472Форки
28Релізи

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

Показано лише найновішу історію — цей репозиторій перевищує вікно збору, тож найраніша історія не захоплена.

01 0002 0003 0004 0003 878450542009-122018-032026-07
Мажорні 4Мінорні 9Патчі 15

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

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

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-22 00:35 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
9CI-Tests12 out of 13 merged PRs checked by a CI test -- score normalized to 9
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/12 approved changesets -- score normalized to 0
10Contributorsproject has 13 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
9Maintained8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9
н/дPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Прямі залежності 5
РеєстрПакетОбмеження версіїМаніфест
RubyGemsactiverecord~> 7.2Gemfile
RubyGemsmysql2Gemfile
RubyGemstrilogyGemfile
RubyGemspgGemfile
RubyGemssqlite3~> 1.6.9Gemfile
Усі залежності 11

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

РеєстрПакетВерсіяЗв'язок
RubyGemsactiverecordпряма
RubyGemspgпряма
RubyGemssqlite3пряма
RubyGemstrilogyпряма
RubyGemsappraisalнепряма
RubyGemsloggerнепряма
RubyGemsminitestнепряма
RubyGemsrakeнепряма
RubyGemssimplecovнепряма
RubyGemssimplecov-jsonнепряма
RubyGemsyardнепряма
Сповіщення про залежності не оцінено

Звірка сповіщень не відбулася для цього звіту: No resolved dependencies carried a version and a supported ecosystem

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 9853,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Ruby": 260269,
        "Shell": 190,
        "Mermaid": 2096
      },
      "pushed_at": "2026-06-25T00:51:43Z",
      "created_at": "2009-10-16T13:37:09Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T07:22:32Z",
      "description": "Organise ActiveRecord model into a tree structure",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "Ruby",
      "significant_languages": [
        "Ruby"
      ]
    },
    "owner": {
      "blog": "http://www.bookingexperts.nl/",
      "name": "Stefan Kroes",
      "type": "User",
      "login": "stefankroes",
      "company": "Booking Experts",
      "location": "Enschede, the Netherlands",
      "followers": 40,
      "avatar_url": "https://avatars.githubusercontent.com/u/37841?v=4",
      "created_at": "2008-12-02T18:29:23Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 6440
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v5.1.0",
          "kind": "minor",
          "published_at": "2026-03-08T21:53:47Z"
        },
        {
          "tag": "v5.0.0",
          "kind": "major",
          "published_at": "2026-02-08T22:43:01Z"
        },
        {
          "tag": "v4.3.3",
          "kind": "patch",
          "published_at": "2023-03-29T01:54:38Z"
        },
        {
          "tag": "v4.3.2",
          "kind": "patch",
          "published_at": "2023-03-26T22:30:00Z"
        },
        {
          "tag": "v4.3.1",
          "kind": "patch",
          "published_at": "2023-03-20T02:10:54Z"
        },
        {
          "tag": "v4.3.0",
          "kind": "minor",
          "published_at": "2023-03-09T21:19:28Z"
        },
        {
          "tag": "v4.2.0",
          "kind": "minor",
          "published_at": "2022-06-10T03:35:54Z"
        },
        {
          "tag": "v4.1.0",
          "kind": "minor",
          "published_at": "2021-06-28T17:55:51Z"
        },
        {
          "tag": "v4.0.0",
          "kind": "major",
          "published_at": "2021-04-13T02:21:53Z"
        },
        {
          "tag": "v3.2.1",
          "kind": "patch",
          "published_at": "2020-09-23T23:55:59Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2020-09-23T14:38:05Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2020-08-03T23:03:57Z"
        },
        {
          "tag": "v3.0.7",
          "kind": "patch",
          "published_at": "2019-06-06T16:43:25Z"
        },
        {
          "tag": "v3.0.6",
          "kind": "patch",
          "published_at": "2019-04-24T14:54:05Z"
        },
        {
          "tag": "v3.0.5",
          "kind": "patch",
          "published_at": "2018-11-06T18:08:07Z"
        },
        {
          "tag": "v3.0.4",
          "kind": "patch",
          "published_at": "2018-11-03T00:17:51Z"
        },
        {
          "tag": "v3.0.3",
          "kind": "patch",
          "published_at": "2018-10-23T15:42:35Z"
        },
        {
          "tag": "v3.0.2",
          "kind": "patch",
          "published_at": "2018-04-23T14:21:40Z"
        },
        {
          "tag": "v3.0.1",
          "kind": "patch",
          "published_at": "2017-07-05T18:28:44Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2017-05-20T10:47:20Z"
        },
        {
          "tag": "v2.2.2",
          "kind": "patch",
          "published_at": "2016-11-01T21:03:03Z"
        },
        {
          "tag": "v2.2.1",
          "kind": "patch",
          "published_at": "2016-10-25T21:03:45Z"
        },
        {
          "tag": "v2.2.0",
          "kind": "minor",
          "published_at": "2016-10-25T15:26:39Z"
        },
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2014-04-16T10:22:05Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2013-05-17T15:05:53Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2012-05-04T11:37:14Z"
        },
        {
          "tag": "v1.2.5",
          "kind": "patch",
          "published_at": "2012-03-15T12:10:37Z"
        },
        {
          "tag": "v1.2.4",
          "kind": "patch",
          "published_at": "2011-04-22T07:44:20Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "e8c09d27929a292452901c8b5f34b1b0a1b882b4",
          "body": "…tions/checkout-7\n\nBump actions/checkout from 6 to 7",
          "is_bot": false,
          "headline": "Merge pull request #765 from stefankroes/dependabot/github_actions/ac…",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-06-25T00:51:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8d6299ad4df38106fb23dea045f18f5ba5384f5",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v6...v7)\n\n---\nupdated-dependenc\n[…]\n:\n- dependency-name: actions/checkout\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump actions/checkout from 6 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-06-22T13:32:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b0aa873bc340005389d4f974fd67c50693b43d33",
          "body": "Add rake check_no_db_at_load task",
          "is_bot": false,
          "headline": "Merge pull request #763 from kbrock/check-no-db-at-load",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-05-04T07:52:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1c1ea51968f16f5454687bda76799a0280474c88",
          "body": "Motivation\n---\nSchema-touching regressions at class load time can slip in undetected.\nNo automated check existed to catch them.\n\nAfter\n---\n`rake check_no_db_at_load` requires ancestry and fails if any code\ntriggers a database connection during load.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add rake check_no_db_at_load task",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-05-04T07:42:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f353de7f9c66f1cf88cf398a5af6aa7088eeb66a",
          "body": "Docs: restore generated-column links and add version-tag note",
          "is_bot": false,
          "headline": "Merge pull request #762 from sdhull/docs-restore-generated-column-links",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-28T04:35:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "117209be6c251e0ea2b5486ae2612dd684d1b28a",
          "body": "The split of CONFIGURATION.md out of README.md (d8e65f2) dropped the\nlink to MySQL's generated columns docs from the Cached Columns section\nand left the preceding code fence unclosed. Restore the MySQL link,\nadd the equivalent PostgreSQL link, and close the fence.\n\nAlso add a note at the top of READ\n[…]\nmd letting\nreaders know that GitHub's default view is the master branch, which\ntracks active development — so they should switch to the tag matching\ntheir installed version when consulting these docs.",
          "is_bot": false,
          "headline": "Restore generated-column docs links and add version-tag note",
          "author_name": "Steve Hull",
          "author_login": "sdhull",
          "committed_at": "2026-04-28T03:32:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4641da6e50fabb5a48c877e4074dfd68188ee0d8",
          "body": "Add missing leaves diagram",
          "is_bot": false,
          "headline": "Merge pull request #760 from kbrock/add-leaves-image",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-27T03:41:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3b8edadad91dca1e282b77046edcf5d75ec6554",
          "body": "README references img/leaves.png but the file was never committed.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add missing leaves diagram to navigation images",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-27T03:33:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "86ebfbf8d22ccad65f46ec42daa374f9ae3ad68c",
          "body": "Conditional SQL based upon connector (mysql/pg/sqlite)",
          "is_bot": false,
          "headline": "Merge pull request #758 from kbrock/adapter-module",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T08:32:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d893f6aa01903df3402e7aa7ebcd75c5ecf7167d",
          "body": "Before:\n  # materialized_path.rb\n  class MaterializedPath\n    def self.concat(adapter, *args)\n      if %w(sqlite sqlite3).include?(adapter)\n        args.join('||')\n      else\n        %{CONCAT(#{args.join(', ')})}\n      end\n    end\n  end\n\nAfter:\n  # adapter.rb — mixed into format modules via extend\n \n[…]\ndules call pg?, mysql?, sqlite?, and concat bare.\nmp2/mp3/ltree inherit via class chain. MaterializedPathArray\nextends separately.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Adapter: absorb concat helper and mix into format modules",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T07:32:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "06199c33189d29b1bfce541e9bb0ae80acfd9b03",
          "body": "Centralizes the duplicated %w(pg postgresql postgis) / %w(mysql mysql2 trilogy)\nmatchers used across format modules and class_methods. Single source of truth\nfor \"is this Postgres / MySQL / SQLite\" checks.\n\n  Ancestry::Adapter.pg?       # default: current connection\n  Ancestry::Adapter.mysql?(adapte\n[…]\ns in materialized_path*.rb, class_methods.rb,\nand migration.rb can migrate over time — not done in this commit\nto keep it focused.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Ancestry::Adapter detection module",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T07:32:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4e532d29aa0b59f4d39f37d608b968cd17f0a5e4",
          "body": "Memoize child_ancestry_sql on the model class",
          "is_bot": false,
          "headline": "Merge pull request #757 from kbrock/memoize-child-ancestry-sql",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T07:21:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f09946b388f4461584812f778f784d1a42d18bc1",
          "body": "Before\n======\n\n- every call to child_ancestry_sql was a database call\n\nAfter\n======\n\n- calls to child_ancestry_sql is cached in @child_ancestry_sql\n\nMatches the existing ||= pattern used by ancestry_depth_sql,\nancestry_parent_id_sql, and ancestry_root_id_sql.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Memoize child_ancestry_sql on the model class",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T07:17:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b5fcf66a6cb93d3bcd5f6ceb5c38306600e5b852",
          "body": "ltree: properly escape child ancestry sql",
          "is_bot": false,
          "headline": "Merge pull request #756 from kbrock/ltree-quoted",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T05:49:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6a8479049db1e74c3c212337a918756af55e919",
          "body": "Before:\n  Arel.sql(\"'#{child_ancestry}'\")\n  Arel.sql(\"nlevel(#{table}.#{col}) > nlevel('#{child_ancestry}')\")\n\nAfter:\n  Arel::Nodes::Quoted.new(child_ancestry)\n  Arel::Nodes::NamedFunction.new('nlevel', [attr]).gt(\n    Arel::Nodes::NamedFunction.new('nlevel', [Arel::Nodes::Quoted.new(child_ancestry)])\n  )\n\nQuoted goes through connection.quote at compile time, escaping\nembedded quotes. Functionally identical for integer ids.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ltree: parameterize child_ancestry values",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-12T03:04:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "14f93b63067cea5b25478a03a0a0ce98ff6cb97e",
          "body": "Move descendants conditions into instance builder methods",
          "is_bot": false,
          "headline": "Merge pull request #755 from kbrock/dynamic_conditions",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-10T02:10:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ea91fca947abcae65aebc2a88395756ac65407da",
          "body": "Use Arel::Nodes::Exists and Arel::Nodes::Not instead of raw SQL string\nfor leaves_condition in MaterializedPath and MaterializedPathArray.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Convert leaves_condition to arel",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-10T01:34:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "278aaac5657d139b2bd2dbf163dddf6d96ffb7b1",
          "body": "Most looking forward to leaves conditions",
          "is_bot": false,
          "headline": "Move roots_condition and leaves_conditions into MaterializedPath",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-10T01:34:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7e870eb8e125a9b507c1167d09d2eaabda51159",
          "body": "Move unscoped_descendants and unscoped_descendants_before_last_save from\nInstanceMethods to the builder where they inline the format module call\ndirectly. Delete descendant_conditions and descendant_before_last_save_conditions\n— no callers remain.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Inline descendant conditions into builder",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T19:51:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a6deba49dfa1f8c8d87a276bed3bfedbcda4db70",
          "body": "Remove one layer of indirection. No longer call descendants_by_ancestry\n\nchanges to:\n - descendants_of\n - descendant_conditions\n - descendant_before_last_save_conditions",
          "is_bot": false,
          "headline": "Inline descendants_by_ancestry into its callers",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T19:40:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e45146750d814daf960c6242792c3d8ad344a514",
          "body": "Move callback methods to static helpers with builder wrappers",
          "is_bot": false,
          "headline": "Merge pull request #754 from kbrock/named_prefix",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T19:00:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7cfb5d64c7468bed0af98b8873662842d880eaea",
          "body": "Move 7 callback-registered methods from InstanceMethods (shared module)\nto ClassMethods static helpers with one-line wrappers in the builder.\nParameterize association names in sync/lookup helpers.\n\nMethods moved: ancestry_exclude_self, update_descendants_with_new_ancestry,\napply_orphan_strategy_root\n[…]\nll site gets its own wrapper,\nenabling future multi-column support.\n\nAlso refactored scope_depth to write depth constraints directly instead\nof dispatching through the 5 named scopes. Same SQL output.",
          "is_bot": false,
          "headline": "Move callback methods to static helpers with builder wrappers",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T18:33:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "23c5d42e6115b681c092327f18a2e22bc809fda0",
          "body": "Doc cleanup",
          "is_bot": false,
          "headline": "Merge pull request #753 from kbrock/doc_cleanup",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T17:22:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8e65f25aabc1e8b9f22d151f9148547677fa439",
          "body": null,
          "is_bot": false,
          "headline": "Split more advanced config.md out of readme.md",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-09T04:59:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8df4a5c45fc468a501c4d4d7011cdd86b81e2a5",
          "body": null,
          "is_bot": false,
          "headline": "Add tests for a few extra operators",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-04-07T05:00:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fe05257ab1639481ed4f689f751d7a8afc8e8d4a",
          "body": "Remove deprecated activerecord-trilogy-adapter from Appraisals",
          "is_bot": false,
          "headline": "Merge pull request #752 from kbrock/drop_trilogy_adapter_gem",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T21:26:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc4669782dc46810a399c461079a589371e150e4",
          "body": "Trilogy adapter is built into Rails 7.1+. The activerecord-trilogy-adapter\ngem is deprecated and not needed — trilogy support only targets Rails 7.1+.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove deprecated activerecord-trilogy-adapter from Appraisals",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T21:22:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0bc6dda8195be85e4a3d9d40acb4d088ffd69a3e",
          "body": "Add trilogy adapter support and make mysql2 optional",
          "is_bot": false,
          "headline": "Merge pull request #751 from kbrock/optional_mysql",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T04:43:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d70be7d5d29f51256402bebd2f717c005db10126",
          "body": "mysql2 requires native MySQL libraries which not all developers have\ninstalled. Gate mysql2 behind BUNDLE_INSTALL_MYSQL=1 in the main\nGemfile. Appraisal gemfiles keep mysql2 hardcoded for CI.\n\nAdd trilogy adapter support throughout:\n- Add \"trilogy\" to all mysql adapter name checks in format modules\n\n[…]\nmfile_72 for CI\n- Normalize DB=trilogy in test environment\n\nCo-Authored-By: Daniel Berger <78529+djberg96@users.noreply.github.com>\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add trilogy adapter support and make mysql2 optional for development",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T04:30:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "42b36c2faafcad412c702f38a783585a57c6e513",
          "body": "Support UUID and string primary keys with array format",
          "is_bot": false,
          "headline": "Merge pull request #750 from kbrock/array_uuid_support",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T03:47:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72815e93f9d4f6e5b1afd4426e63220577b5d06a",
          "body": "The array format hardcoded ::integer[] casts in all SQL, preventing\nUUID or string primary keys from working. Now derives the cast type\nfrom the values (integer vs string) and uses ::varchar[] for non-integer.\n\nChanges:\n- Add array_literal helper to MaterializedPathArray for proper quoting\n  and cas\n[…]\normat: option to t.ancestry migration helper\n  (creates text[] column for non-integer formats)\n- Remove array skip from UUID tests\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Support UUID and string primary keys with array format",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-31T03:42:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2a33ec3a75ca5520685640b789525dc3130f2db7",
          "body": "Clean up test output and fix cross-format test infrastructure",
          "is_bot": false,
          "headline": "Merge pull request #748 from kbrock/run_all_tests",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-30T04:01:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a6f4bdca0439355920fd8db05335ee8e33e2a2f",
          "body": "- Create ltree extension on all pg runs, not just FORMAT=ltree\n- Use skip instead of return-unless for pg-only tests (ltree, array)\n- Skip array DB tests on Rails < 7.0 (column cache reset issue)\n- Silence deprecation warning in depth_cache_column test\n- Add assertion to test_node_before_last_save (was raise-only)\n- Add array reparent-across-trees test (verifies prefix matching fix)\n- Add CI status badge to README\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Clean up test output and fix cross-format test infrastructure",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-30T03:40:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cefd004432f36b27749ddcd76674a19e57eba745",
          "body": "Switch descendants_condition from @> containment to slice prefix\nmatching (ancestry[1:N] = ARRAY[...]). Containment is order-independent\nand returns incorrect results during cascading moves when ancestry is\nbeing rewritten (same root cause as stale ancestry bug #735/#739).\n\nPrefix matching is correc\n[…]\n (GIN-indexed, fast reads):\n#   Arel.sql(\"#{col} @> ARRAY[#{ids}]::integer[]\")\n# Restore once stale ancestry fix (#735) is merged.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix array format descendants query to use prefix matching",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-30T03:35:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "855fd2ca93fecc08759e60c3df8b829fad394be1",
          "body": "When a test passes ancestry_format: to with_model (e.g., array test\nrunning on an mp2 CI entry), the table column type differs from what\nActiveRecord cached from the previous test. Reset column information\nbefore and after has_ancestry to ensure the model sees the correct\ncolumn type.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix column cache when tests use non-default ancestry format",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-29T17:15:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "054cc50fc5baee2b8a565ed7bd2fc699cd21cb29",
          "body": "- Add array format entry (8.1 + Ruby 3.4)\n- Run mysql tests on one matrix entry only (mp1 + 7.2) instead of all\n- Set ANCESTRY_COLUMN=ancestry_alt globally instead of separate pg steps\n- Remove duplicate run on pg alt column + sql step (was running twice)\n- Skip sqlite for ltree and array (pg-only formats)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Streamline CI matrix: add array format, reduce redundant runs",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-28T07:48:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "87108ba6bc73875acd342ed5b8d94642ab0cf41e",
          "body": "- Remove FORMAT guards from mp1/mp2/mp3 tests; use ancestry_format: option\n  so tests run on every local run regardless of FORMAT env var\n- Add array_test.rb and expand ltree_test.rb with parse/generate unit tests\n  (pure Ruby, no DB), DB tree operations, and sql update strategy tests\n- Add sql upda\n[…]\nity\n- Drop unused MaterializedPathArray.delimiter method\n- Document unreachable blank branches in ltree/array replace_ancestry_sql\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Improve test coverage across formats and update strategies",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-28T07:48:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "863e12cd0394309809b65e47f0c64ca646d4e391",
          "body": "Ltree aliased parse_integer to parse, always returning integers via\nto_i. Array did the same. This prevents future use with string-based\nancestry keys since parse would destroy string values.\n\nNow parse returns strings (like mp1/mp2/mp3) and parse_integer returns\nintegers. The builder selects the correct method based on integer_pk\nat build time.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Split parse and parse_integer for ltree and array formats",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-28T07:48:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b25f66b3b851241df4a6b64d178bdd0652aa1ee0",
          "body": "Remove dead primary_key_is_an_integer? and add PR template",
          "is_bot": false,
          "headline": "Merge pull request #746 from kbrock/remove_dead_code",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T05:56:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca68b380760d1c85c796cd36f2b9d6e617aab5eb",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add pull request template",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T05:53:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "491e783935b136d4bb15a05c7a88559dbf5109a4",
          "body": "No longer called after #744 baked integer_pk into the builder.\nThe builder now resolves integer vs string PK at build time via\nprimary_key_format symbols (:integer, :uuid, :string).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove dead primary_key_is_an_integer? method",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T05:42:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1b816752c121712d59b2e6350a5619634d58bb29",
          "body": "Move ordered_by_ancestry to format modules",
          "is_bot": false,
          "headline": "Merge pull request #745 from kbrock/ordered_by_ancestry",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T03:48:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7de7d1b91336ee414b0e81219692096f49f0a93c",
          "body": "Extract adapter-sniffing and Arel node construction from generated\ncode into format module methods. The builder now calls a one-liner.\n\nmp1: handles NULL roots with NULLS FIRST (6.1+) or COALESCE fallback\nmp2/mp3/ltree/array: simple ascending (no NULL handling needed)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Move ordered_by_ancestry to format modules",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T03:29:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c905a82fbb18c72dbca2761daec6e9def3b15511",
          "body": "Add UUID primary key support with primary_key_format symbols",
          "is_bot": false,
          "headline": "Merge pull request #744 from kbrock/uuid_tests",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T03:19:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b864073c95b66028a0c29e0009f36a523af9293a",
          "body": "We were determining this at runtime. now we are using the primary_key_format.\nThis removes the variable and gets statically set in the builder.\n\nwe are using 2 methods for parsing: parse, parse_integer. could have passed a true/false.\nroot no longer needs to be passed around as well.",
          "is_bot": false,
          "headline": "primary_key_is_an_integer determined up front",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T03:06:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b7b2875ca2af515370f10c8acf8fc3d9ec23ad7",
          "body": "Introduce primary_key_format: :uuid (and :string, :integer symbols)\nas alternatives to raw regex strings. Resolves to validation regex +\ninteger_pk boolean at build time.\n\nBake integer_pk as literal (true/false) in generated methods,\neliminating runtime DB introspection for known formats. Custom reg\n[…]\neger?\n\nAdd UUID test coverage: basic tree ops, moves, descendants/ancestors,\npredicates, orphan rootify, arrange, integrity check.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add UUID primary key support and bake integer_pk into builder",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-27T03:02:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a2c57ed0a3a857834ee4356749366d7ff68c0314",
          "body": "Cache ancestor_ids to avoid re-parsing ancestry column",
          "is_bot": false,
          "headline": "Merge pull request #743 from kbrock/ancestor_ids_cache",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-26T03:13:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78fd3c2a5d65a113326714de81662a48c907d4f7",
          "body": "ancestor_ids is called by parent_id, root_id, depth, path_ids, and\npredicates — each re-parsing the ancestry string. Cache with ||= and\nclear on ancestor_ids=, reload. Freeze cached arrays to prevent\naccidental mutation.\n\nancestor_ids= caches the value directly (already parsed).\nparent= and parent_i\n[…]\n\nthe result (e.g., delete_if) must use non-mutating alternatives.\nFixed apply_orphan_strategy_adopt to use - instead of delete_if.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Cache ancestor_ids to avoid re-parsing ancestry column",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-26T02:20:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0f049e25be599b4e49589f746a5b0ce25854ffdd",
          "body": "Optimize arrange_nodes for default rootify strategy",
          "is_bot": false,
          "headline": "Merge pull request #741 from kbrock/arrange_perf",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T07:02:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d8bd54a9a47d42bede2eb76732ddac8247f90108",
          "body": "Check orphan_strategy once before the loop instead of branching\nper node. The default :rootify path uses a single `unless` check\n(matching v4.1 behavior), avoiding if/elsif/case on every iteration.\n\nBefore: 445 i/s (830 nodes)\nAfter:  600 i/s (830 nodes, 1.35x faster)\n\nNon-default strategies (:destroy, :restrict) use the branching path\nunchanged.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Optimize arrange_nodes for default rootify strategy",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T06:56:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f07dd2856d78a61893792d36547646aff9eb0765",
          "body": "Hardcode delimiter in format modules for parse performance",
          "is_bot": false,
          "headline": "Merge pull request #740 from kbrock/parse_perf",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T06:46:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "84de51d1f7041cc9731dbf20bbf324d68cf8c963",
          "body": "Format modules now use their own DELIMITER constant internally.\nNo need to pass delimiter from the builder — each module knows\nits own delimiter. Removes 17 delimiter references from the\ninstance methods builder and 3 from the migration helper.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Remove delimiter parameter from format module methods",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T06:41:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3a6610317a30954635bc89c90c1ff60ca3519555",
          "body": "Replace dynamic delimiter parameter with DELIMITER constant in\nMaterializedPath, MaterializedPath2, and MaterializedPath3.\n\nKey change: remove delete_if(&:blank?) from parse — mp1/mp3 don't\nneed it (no leading delimiter), mp2 uses [1..] instead (2x faster).\n\nBefore (shared parse with delete_if):\n  m\n[…]\n, no delete_if):\n  mp1 parse: 2.57M i/s  (2.4x faster)\n  mp2 parse: 1.93M i/s  (2.0x faster)\n  mp3 parse: 2.44M i/s  (2.4x faster)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Hardcode delimiter in format modules for parse performance",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T06:41:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "02641f5bc9dea157e66b16b742d3451426c5d03e",
          "body": "Revert cascading move fix (#735) due to write perf regression",
          "is_bot": false,
          "headline": "Merge pull request #739 from kbrock/rollback_refresh",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T05:02:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9cf83db04f43547d81deb87458c67e95fe1505a",
          "body": "Roll back #735 (refresh_ancestry_from_database). The before_update\nSELECT added +1 query per reparent (~25% write regression) to fix a\nscenario (cascading moves without reload in a single request) that\ndoesn't occur in practice.\n\nStale ancestry tests are kept but skipped — documenting the known\nbug while we work on a zero-cost fix.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Revert cascading move fix due to write performance regression",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-23T04:57:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ab8adc421e4c4c4a79487f9299c5547255b895ae",
          "body": "Add counter cache edge case tests and changelog update",
          "is_bot": false,
          "headline": "Merge pull request #738 from kbrock/test_improvements",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T03:13:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4baee7cbeba417cfe19b19802aaf97b4dcb1b26c",
          "body": "… 7.1+\n\nRails 7.1+ clears the flag between transactions, making our guard\nredundant. The transaction rollback on 0-row DELETE is the real\nprotection against double-decrement.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add TODO to remove @_trigger_destroy_callback guard when min Rails is…",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T03:09:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "776ec5708efedecafc500c02ec3b8cc0ab3a0ae0",
          "body": "Wrap check_ancestry_integrity!(report: :echo) with assert_output\nso the error message doesn't leak into test runner output.\n\nHandle Rails 6.0 same-object double destroy (callbacks fire twice\nbefore 6.1 when @_trigger_destroy_callback isn't cleared).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Capture stdout in integrity echo test and fix Rails 6.0 compat",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T03:01:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3e36d339162810a55eb854ed4d5f88933aead1f6",
          "body": "Cover orphan strategies (destroy, rootify, adopt), subtree destroy,\nduplicate destroy (same object, two objects, already-deleted row),\nand a failing reproducer for #521 (move-then-destroy stale object\ncauses children_count = -1).\n\nThe adopt test documents that the guard asymmetry between\nincrease/up\n[…]\nte destroy tests document that Rails' transaction rollback\non 0-row DELETE is the real protection, not @_trigger_destroy_callback.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add counter cache edge case tests",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T02:37:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c95a2597ed1f8aa0c159c45a4cb4cdad729e1c7a",
          "body": null,
          "is_bot": false,
          "headline": "update changelog to capture new features added.",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T02:37:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "167a39a1df2a40985e175770d11ea906e6afc472",
          "body": "Hardcode pk and ids in builder for mp3 and ltree",
          "is_bot": false,
          "headline": "Merge pull request #737 from kbrock/mp3",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-21T02:35:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6d5182f2bdd51e7218ad277f46e983d45f8cb6b",
          "body": null,
          "is_bot": false,
          "headline": "hard code the id where possible instead of looking up the primary_key",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-19T04:18:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49f91df16692c8366ede21f519e1c3ed63fc2b60",
          "body": null,
          "is_bot": false,
          "headline": "ltree is a string and the ids are integers. hardcode it",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-19T03:24:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58dd22439958576f83e7b1b10cb97b6c04ea5254",
          "body": null,
          "is_bot": false,
          "headline": "test materialized path 3",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-19T03:16:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "448e6b6f396f96da11f234711fbb12c4b9026d2b",
          "body": "Introduce Int array format",
          "is_bot": false,
          "headline": "Merge pull request #736 from kbrock/intarray",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T06:33:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b280ba9ba4c15f9979b341c4cd1f5a4584a60679",
          "body": "for a new migration, no reason to support a legacy key.\n\nThis was a fixup. Sorry it didn't squash into the original commit",
          "is_bot": false,
          "headline": "Migration Helper: use format key instead of ancestry_format",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T06:19:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b75930ed436e5fe048a85125c29117c30a022323",
          "body": "Stores ancestry as PostgreSQL integer arrays instead of delimited strings.\nUses slice prefix matching for descendants_condition (safe with stale\nin-memory state, though not GIN-indexed). Performance optimization to\nuse @> containment is deferred pending a fix for stale ancestry state\nafter cascading moves.",
          "is_bot": false,
          "headline": "Introduce MaterializedPathArray for PostgreSQL integer[] ancestry",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T06:17:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a29885a56383e5b889e50c330d298e4d9f24b464",
          "body": "Stale ancestry fix",
          "is_bot": false,
          "headline": "Merge pull request #735 from kbrock/stale_ancestry_fix",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T06:10:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4eb9c26dfec7ce28acbe13d278ee881656cade4d",
          "body": "The stale ancestry fix adds a refresh_ancestry_from_database SELECT\nbefore each move. Update assert_queries counts to reflect the +1 query:\n- setter parent=: 2→3\n- setter parent_id=: 3→4\n- counter cache move: 4→5\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update query count assertions for refresh_ancestry callback",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:51:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bf242759f4b1a3e59c5a4d2990da9e650a6529bf",
          "body": "When node A moves, update_descendants changes B's ancestry in the DB\nbut not B's Ruby object. If B then moves without reload, dirty tracking\nhas the wrong \"before\" value, so update_descendants queries the wrong\nprefix and misses B's descendants.\n\nAdds before_update :refresh_ancestry_from_database which picks the real\nDB value and resets dirty tracking. update_descendants stays in\nafter_update — no callback ordering change.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix cascading moves orphaning descendants due to stale ancestry",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:51:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "46729f200acff4f59cf90e7a9cc6f32528d85eb4",
          "body": "Introduce t.ancestry migration helper for table setup",
          "is_bot": false,
          "headline": "Merge pull request #734 from kbrock/migration_helper",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:49:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d33646a73a08d2033d6f3ac7ad8d031553413936",
          "body": null,
          "is_bot": false,
          "headline": "Add migration helper to to readme.md and extract formats_and_columns.md",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:37:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d62705c71855c6d0f1af88ec7b179f97c2688c0",
          "body": "Adds Ancestry::Migration module extending TableDefinition with a\nt.ancestry helper that creates the correct column type, indexes,\ncollation, and cache columns based on format options.\n\nReplaces manual column/index/cache setup in test environment with\nthe new helper, removing the duplicated add_cache_column method.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Introduce t.ancestry migration helper for table setup",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:14:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b35cf64799d4b2f95fac074f4687ca23f6f60768",
          "body": "Add assert_queries test helper for SQL query count assertions",
          "is_bot": false,
          "headline": "Merge pull request #733 from kbrock/count_queries",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T05:14:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b37654c57287a19fe75e0012fc0c1dd4ed44e364",
          "body": "Introduces assert_queries(expected) helper that counts SQL queries\nin a block, filtering out transactions and schema queries. Supports\nboth exact counts and ranges. Applied to setter tests to document\nthe query cost of parent= and parent_id= moves.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add assert_queries test helper for SQL query count assertions",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-17T04:27:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f230145d5a53c3a831fdd037480a02e54f0593d8",
          "body": "Test cleanup",
          "is_bot": false,
          "headline": "Merge pull request #732 from kbrock/test_cleanup",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-14T03:13:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f54db2b49e5a915ba17d8b14d10e67571c9ec23",
          "body": "for some tests, we need to point to a particular serializer.\nWe have them for all but the original mode",
          "is_bot": false,
          "headline": "Introduce TestEnvironment#materialized_path",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-14T03:03:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "29e08a2f1833ef5ced86027320769ec587b905a4",
          "body": "Probably want to extract this but for now to a migration helper\nor a generator\n\nFor now, creating it correctly.",
          "is_bot": false,
          "headline": "Add indexes for the various fields in tests",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-14T02:56:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58d6f5a3a7aef2ef725e647fd5a2045e1fc4bb09",
          "body": "Add verbose option to rebuild_counter_cache! for reporting",
          "is_bot": false,
          "headline": "Merge pull request #731 from kbrock/fixup_counter_cache",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-14T02:53:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a433ba020748e695bc51bd8571472d527f23425f",
          "body": "rebuild_counter_cache!(verbose: true) now returns the number of rows\nthat had incorrect counter values before the fix. Default behavior\nis unchanged (no extra query, returns nil).\n\nThe verbose pre-count uses the same correlated subquery as the bulk\nUPDATE — one index lookup per row on the ancestry c\n[…]\nardless of how many rows\nare wrong.\n\nInspired by counter_culture gem's fix_counts which reports\ndiscrepancies rather than silently fixing them.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add verbose option to rebuild_counter_cache! for reporting",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T23:39:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "59da340e3bd1a5caf3c89977e35a9f8cca83062a",
          "body": "Make delimiter part of the materialized path format",
          "is_bot": false,
          "headline": "Merge pull request #730 from kbrock/drop_delimiter",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T06:16:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20a445d68c83d05f5e35af10203397f2f2495625",
          "body": "Introduce MaterializedPath using ltree",
          "is_bot": false,
          "headline": "Merge pull request #729 from kbrock/add_ltree",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T06:13:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d40a95923d93fb24e6e10a95841b9a6c7949b05",
          "body": null,
          "is_bot": false,
          "headline": "Make delimiter part of the materialized path format",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T06:10:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "605c3e5a07c67233a15784d5aea7c4052f433f19",
          "body": null,
          "is_bot": false,
          "headline": "Introduce MaterializedPath using ltree",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T06:10:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dcde3dd079c9311f7688cc084537f56dcfffb31",
          "body": "Introduce Materialized path3",
          "is_bot": false,
          "headline": "Merge pull request #728 from kbrock/materialized_path3",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-13T01:54:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d3b83bdf496818b7c78f6e6de5f7e0e753e5ede",
          "body": "This alters the way we handle the delimiters in materialized path\nmp:   1/2/3\nmp2: /1/2/3/\nmp3:  1/2/3/\n\nDetermining the one with the simplest code to generate sql/ruby code",
          "is_bot": false,
          "headline": "Introduce MaterializedPath3",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-12T23:46:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4c0ec12d576360da55a8814cfd6c42fbe9348c52",
          "body": null,
          "is_bot": false,
          "headline": "v6.0 CHANGELOG updated",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-12T23:16:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b28564d4c161d4486ab2c61fcf0961107e3f089d",
          "body": "Support all databases for virtual columns",
          "is_bot": false,
          "headline": "Merge pull request #727 from kbrock/virtual_everything",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T22:52:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4306f121a88dbb11790c2ad6e9fb9237bff265f3",
          "body": "For virtual columns, mysql does not support referencing the id column since\nit increments. Have noted that the root_id is not available on that platform",
          "is_bot": false,
          "headline": "Support all databases for virtual columns",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T22:17:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f3db71834247505ede2bdfe00e6d6d1f2f0ad15",
          "body": "Introduce leaves tests",
          "is_bot": false,
          "headline": "Merge pull request #726 from kbrock/leaf_nodes",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T05:57:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f0749b59acdfc7b4c95cdcf290767e896e6a2c54",
          "body": "Input taken from #246 and #341\n\nIn a single query, brings back only leaf nodes.",
          "is_bot": false,
          "headline": "Introduce leaves",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T05:47:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "15fae192f43886a8eb51d2005c36909b38fabade",
          "body": "Introduce leaves",
          "is_bot": false,
          "headline": "Merge pull request #725 from kbrock/leaf_nodes",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T04:20:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "249d86a0b3f81d5bea189ff9ef59c143fe2f06fe",
          "body": "Input taken from #246 and #341\n\nIn a single query, brings back only leaf nodes.",
          "is_bot": false,
          "headline": "Introduce leaves",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T04:08:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76ffc156d21611bd7c3df2a6392296673f90cafb",
          "body": "Add has_many :children",
          "is_bot": false,
          "headline": "Merge pull request #723 from kbrock/parent_associations",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T04:06:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2101b49f5cc38aec92327876dc9b63b64e982968",
          "body": "We introduced cached parent_id and root_id.\nThis adds associations for those relations like children, parent, and root\n\nAdd documentation for the developer as well",
          "is_bot": false,
          "headline": "Introduce has_many :children and belongs_to :parent",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T04:02:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "815c9ae3eccfe59bc525106a2c15abbe42552c6c",
          "body": "Use newer deprecation scheme",
          "is_bot": false,
          "headline": "Merge pull request #724 from kbrock/deprecation_method",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-11T01:11:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffee0ef2bfdea3842cf44d3bbc844004bf9d5414",
          "body": null,
          "is_bot": false,
          "headline": "Use newer deprecation scheme",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-10T21:29:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b5f7e0ec4671f42a4487e331f7348841a04cce04",
          "body": "fix postgres root_id_sql (and extra tests for coverage)",
          "is_bot": false,
          "headline": "Merge pull request #722 from kbrock/more_tests",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-09T02:58:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90aa428fab60e71836349b194a73ec6ae52f4e76",
          "body": null,
          "is_bot": false,
          "headline": "test coverage",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-09T02:39:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b87fbd14bc8e7e275445e60cd886effaa28e7709",
          "body": null,
          "is_bot": false,
          "headline": "Fix root_id for postgres",
          "author_name": "Keenan Brock",
          "author_login": "kbrock",
          "committed_at": "2026-03-09T02:39:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 28,
      "commits_last_year": 145,
      "latest_release_at": "2026-03-08T21:53:47Z",
      "latest_release_tag": "v5.1.0",
      "releases_from_tags": true,
      "days_since_last_push": 26,
      "active_weeks_last_year": 20,
      "days_since_latest_release": 135,
      "mean_days_between_releases": 221.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 71,
      "has_issue_template": false,
      "has_code_of_conduct": true,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "ancestry",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "rubygems",
          "matches_repo": true,
          "registry_url": "https://rubygems.org/gems/ancestry",
          "is_deprecated": false,
          "latest_version": "5.1.0",
          "repository_url": "https://github.com/stefankroes/ancestry/",
          "versions_count": 38,
          "total_downloads": 38034866,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2009-10-16T16:18:52.272000Z",
          "latest_published_at": "2026-03-08T22:01:59.049000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 135
        }
      ]
    },
    "popularity": {
      "forks": 472,
      "stars": 3878,
      "watchers": 45,
      "fork_history": {
        "days": [
          {
            "date": "2009-12-06",
            "count": 1
          },
          {
            "date": "2010-02-14",
            "count": 1
          },
          {
            "date": "2010-02-21",
            "count": 1
          },
          {
            "date": "2010-02-26",
            "count": 1
          },
          {
            "date": "2010-03-16",
            "count": 1
          },
          {
            "date": "2010-04-08",
            "count": 1
          },
          {
            "date": "2010-04-11",
            "count": 1
          },
          {
            "date": "2010-04-23",
            "count": 1
          },
          {
            "date": "2010-06-16",
            "count": 1
          },
          {
            "date": "2010-06-30",
            "count": 1
          },
          {
            "date": "2010-09-13",
            "count": 1
          },
          {
            "date": "2010-09-27",
            "count": 1
          },
          {
            "date": "2010-09-30",
            "count": 1
          },
          {
            "date": "2010-10-13",
            "count": 1
          },
          {
            "date": "2010-10-16",
            "count": 1
          },
          {
            "date": "2010-10-18",
            "count": 1
          },
          {
            "date": "2010-10-29",
            "count": 1
          },
          {
            "date": "2010-11-18",
            "count": 1
          },
          {
            "date": "2010-11-21",
            "count": 1
          },
          {
            "date": "2010-11-23",
            "count": 1
          },
          {
            "date": "2010-11-26",
            "count": 1
          },
          {
            "date": "2010-12-17",
            "count": 1
          },
          {
            "date": "2011-02-12",
            "count": 1
          },
          {
            "date": "2011-02-17",
            "count": 1
          },
          {
            "date": "2011-02-18",
            "count": 1
          },
          {
            "date": "2011-03-05",
            "count": 1
          },
          {
            "date": "2011-03-31",
            "count": 1
          },
          {
            "date": "2011-04-20",
            "count": 1
          },
          {
            "date": "2011-04-25",
            "count": 1
          },
          {
            "date": "2011-04-29",
            "count": 2
          },
          {
            "date": "2011-05-10",
            "count": 1
          },
          {
            "date": "2011-05-27",
            "count": 1
          },
          {
            "date": "2011-05-30",
            "count": 1
          },
          {
            "date": "2011-06-02",
            "count": 1
          },
          {
            "date": "2011-06-03",
            "count": 1
          },
          {
            "date": "2011-06-07",
            "count": 1
          },
          {
            "date": "2011-06-10",
            "count": 1
          },
          {
            "date": "2011-06-23",
            "count": 1
          },
          {
            "date": "2011-07-17",
            "count": 1
          },
          {
            "date": "2011-07-23",
            "count": 1
          },
          {
            "date": "2011-07-31",
            "count": 1
          },
          {
            "date": "2011-08-22",
            "count": 1
          },
          {
            "date": "2011-08-24",
            "count": 1
          },
          {
            "date": "2011-08-25",
            "count": 1
          },
          {
            "date": "2011-08-27",
            "count": 1
          },
          {
            "date": "2011-09-03",
            "count": 1
          },
          {
            "date": "2011-09-13",
            "count": 1
          },
          {
            "date": "2011-09-21",
            "count": 1
          },
          {
            "date": "2011-11-17",
            "count": 1
          },
          {
            "date": "2011-11-21",
            "count": 1
          },
          {
            "date": "2011-12-03",
            "count": 1
          },
          {
            "date": "2011-12-22",
            "count": 1
          },
          {
            "date": "2012-01-18",
            "count": 1
          },
          {
            "date": "2012-01-28",
            "count": 1
          },
          {
            "date": "2012-02-10",
            "count": 1
          },
          {
            "date": "2012-02-23",
            "count": 1
          },
          {
            "date": "2012-02-27",
            "count": 1
          },
          {
            "date": "2012-03-09",
            "count": 1
          },
          {
            "date": "2012-03-11",
            "count": 1
          },
          {
            "date": "2012-03-14",
            "count": 1
          },
          {
            "date": "2012-04-15",
            "count": 1
          },
          {
            "date": "2012-05-22",
            "count": 1
          },
          {
            "date": "2012-05-28",
            "count": 1
          },
          {
            "date": "2012-06-13",
            "count": 1
          },
          {
            "date": "2012-06-28",
            "count": 1
          },
          {
            "date": "2012-07-02",
            "count": 1
          },
          {
            "date": "2012-08-01",
            "count": 3
          },
          {
            "date": "2012-08-21",
            "count": 1
          },
          {
            "date": "2012-08-23",
            "count": 1
          },
          {
            "date": "2012-09-16",
            "count": 1
          },
          {
            "date": "2012-09-25",
            "count": 1
          },
          {
            "date": "2012-09-26",
            "count": 1
          },
          {
            "date": "2012-09-30",
            "count": 1
          },
          {
            "date": "2012-10-03",
            "count": 1
          },
          {
            "date": "2012-10-04",
            "count": 2
          },
          {
            "date": "2012-10-05",
            "count": 1
          },
          {
            "date": "2012-10-13",
            "count": 1
          },
          {
            "date": "2012-10-24",
            "count": 1
          },
          {
            "date": "2012-12-11",
            "count": 1
          },
          {
            "date": "2012-12-13",
            "count": 1
          },
          {
            "date": "2012-12-18",
            "count": 1
          },
          {
            "date": "2013-01-06",
            "count": 1
          },
          {
            "date": "2013-01-07",
            "count": 1
          },
          {
            "date": "2013-01-11",
            "count": 1
          },
          {
            "date": "2013-01-23",
            "count": 1
          },
          {
            "date": "2013-01-25",
            "count": 1
          },
          {
            "date": "2013-01-29",
            "count": 2
          },
          {
            "date": "2013-01-31",
            "count": 1
          },
          {
            "date": "2013-02-11",
            "count": 1
          },
          {
            "date": "2013-02-18",
            "count": 1
          },
          {
            "date": "2013-02-20",
            "count": 1
          },
          {
            "date": "2013-02-21",
            "count": 1
          },
          {
            "date": "2013-02-22",
            "count": 1
          },
          {
            "date": "2013-03-01",
            "count": 1
          },
          {
            "date": "2013-03-06",
            "count": 2
          },
          {
            "date": "2013-03-16",
            "count": 1
          },
          {
            "date": "2013-03-25",
            "count": 1
          },
          {
            "date": "2013-04-01",
            "count": 1
          },
          {
            "date": "2013-04-03",
            "count": 1
          },
          {
            "date": "2013-04-08",
            "count": 1
          },
          {
            "date": "2013-04-09",
            "count": 1
          },
          {
            "date": "2013-04-11",
            "count": 1
          },
          {
            "date": "2013-04-19",
            "count": 1
          },
          {
            "date": "2013-05-02",
            "count": 1
          },
          {
            "date": "2013-05-03",
            "count": 1
          },
          {
            "date": "2013-05-07",
            "count": 1
          },
          {
            "date": "2013-05-18",
            "count": 1
          },
          {
            "date": "2013-05-21",
            "count": 1
          },
          {
            "date": "2013-06-02",
            "count": 1
          },
          {
            "date": "2013-06-10",
            "count": 1
          },
          {
            "date": "2013-06-14",
            "count": 1
          },
          {
            "date": "2013-06-18",
            "count": 1
          },
          {
            "date": "2013-06-19",
            "count": 1
          },
          {
            "date": "2013-06-24",
            "count": 1
          },
          {
            "date": "2013-07-07",
            "count": 1
          },
          {
            "date": "2013-07-15",
            "count": 1
          },
          {
            "date": "2013-07-19",
            "count": 1
          },
          {
            "date": "2013-07-21",
            "count": 1
          },
          {
            "date": "2013-08-01",
            "count": 1
          },
          {
            "date": "2013-08-04",
            "count": 1
          },
          {
            "date": "2013-08-13",
            "count": 1
          },
          {
            "date": "2013-08-15",
            "count": 1
          },
          {
            "date": "2013-08-16",
            "count": 1
          },
          {
            "date": "2013-08-23",
            "count": 1
          },
          {
            "date": "2013-08-28",
            "count": 1
          },
          {
            "date": "2013-09-05",
            "count": 1
          },
          {
            "date": "2013-09-08",
            "count": 1
          },
          {
            "date": "2013-09-17",
            "count": 2
          },
          {
            "date": "2013-10-03",
            "count": 1
          },
          {
            "date": "2013-10-18",
            "count": 1
          },
          {
            "date": "2013-10-25",
            "count": 1
          },
          {
            "date": "2013-10-26",
            "count": 1
          },
          {
            "date": "2013-11-04",
            "count": 1
          },
          {
            "date": "2013-11-15",
            "count": 1
          },
          {
            "date": "2013-11-24",
            "count": 1
          },
          {
            "date": "2013-11-26",
            "count": 1
          },
          {
            "date": "2013-12-05",
            "count": 1
          },
          {
            "date": "2013-12-16",
            "count": 1
          },
          {
            "date": "2013-12-18",
            "count": 1
          },
          {
            "date": "2013-12-27",
            "count": 1
          },
          {
            "date": "2014-01-04",
            "count": 1
          },
          {
            "date": "2014-01-27",
            "count": 1
          },
          {
            "date": "2014-02-01",
            "count": 1
          },
          {
            "date": "2014-02-05",
            "count": 1
          },
          {
            "date": "2014-02-10",
            "count": 1
          },
          {
            "date": "2014-02-12",
            "count": 1
          },
          {
            "date": "2014-02-26",
            "count": 1
          },
          {
            "date": "2014-03-04",
            "count": 1
          },
          {
            "date": "2014-03-17",
            "count": 1
          },
          {
            "date": "2014-03-19",
            "count": 1
          },
          {
            "date": "2014-03-20",
            "count": 1
          },
          {
            "date": "2014-04-01",
            "count": 1
          },
          {
            "date": "2014-04-16",
            "count": 1
          },
          {
            "date": "2014-04-26",
            "count": 1
          },
          {
            "date": "2014-04-30",
            "count": 1
          },
          {
            "date": "2014-05-05",
            "count": 1
          },
          {
            "date": "2014-05-12",
            "count": 1
          },
          {
            "date": "2014-05-16",
            "count": 1
          },
          {
            "date": "2014-05-19",
            "count": 1
          },
          {
            "date": "2014-05-22",
            "count": 1
          },
          {
            "date": "2014-05-27",
            "count": 1
          },
          {
            "date": "2014-06-06",
            "count": 1
          },
          {
            "date": "2014-06-09",
            "count": 1
          },
          {
            "date": "2014-06-30",
            "count": 1
          },
          {
            "date": "2014-07-01",
            "count": 1
          },
          {
            "date": "2014-07-07",
            "count": 1
          },
          {
            "date": "2014-07-13",
            "count": 1
          },
          {
            "date": "2014-07-17",
            "count": 1
          },
          {
            "date": "2014-07-19",
            "count": 2
          },
          {
            "date": "2014-07-29",
            "count": 1
          },
          {
            "date": "2014-08-16",
            "count": 1
          },
          {
            "date": "2014-08-17",
            "count": 1
          },
          {
            "date": "2014-08-18",
            "count": 2
          },
          {
            "date": "2014-09-26",
            "count": 1
          },
          {
            "date": "2014-10-08",
            "count": 1
          },
          {
            "date": "2014-10-13",
            "count": 1
          },
          {
            "date": "2014-10-14",
            "count": 1
          },
          {
            "date": "2014-10-17",
            "count": 1
          },
          {
            "date": "2014-10-23",
            "count": 1
          },
          {
            "date": "2014-11-05",
            "count": 1
          },
          {
            "date": "2014-11-13",
            "count": 1
          },
          {
            "date": "2014-11-29",
            "count": 1
          },
          {
            "date": "2014-12-10",
            "count": 1
          },
          {
            "date": "2014-12-24",
            "count": 1
          },
          {
            "date": "2014-12-31",
            "count": 1
          },
          {
            "date": "2015-01-07",
            "count": 1
          },
          {
            "date": "2015-01-12",
            "count": 1
          },
          {
            "date": "2015-01-28",
            "count": 1
          },
          {
            "date": "2015-02-14",
            "count": 1
          },
          {
            "date": "2015-03-05",
            "count": 1
          },
          {
            "date": "2015-03-10",
            "count": 1
          },
          {
            "date": "2015-03-12",
            "count": 1
          },
          {
            "date": "2015-03-22",
            "count": 1
          },
          {
            "date": "2015-04-06",
            "count": 1
          },
          {
            "date": "2015-04-20",
            "count": 1
          },
          {
            "date": "2015-05-02",
            "count": 1
          },
          {
            "date": "2015-05-12",
            "count": 1
          },
          {
            "date": "2015-05-13",
            "count": 1
          },
          {
            "date": "2015-05-24",
            "count": 1
          },
          {
            "date": "2015-05-29",
            "count": 1
          },
          {
            "date": "2015-07-01",
            "count": 1
          },
          {
            "date": "2015-07-15",
            "count": 1
          },
          {
            "date": "2015-08-11",
            "count": 1
          },
          {
            "date": "2015-09-02",
            "count": 1
          },
          {
            "date": "2015-09-07",
            "count": 1
          },
          {
            "date": "2015-09-09",
            "count": 1
          },
          {
            "date": "2015-09-14",
            "count": 1
          },
          {
            "date": "2015-09-20",
            "count": 1
          },
          {
            "date": "2015-09-22",
            "count": 1
          },
          {
            "date": "2015-10-14",
            "count": 1
          },
          {
            "date": "2015-10-20",
            "count": 1
          },
          {
            "date": "2015-10-29",
            "count": 1
          },
          {
            "date": "2015-11-11",
            "count": 1
          },
          {
            "date": "2015-11-16",
            "count": 1
          },
          {
            "date": "2015-11-24",
            "count": 1
          },
          {
            "date": "2015-11-27",
            "count": 1
          },
          {
            "date": "2015-11-29",
            "count": 1
          },
          {
            "date": "2015-12-03",
            "count": 2
          },
          {
            "date": "2015-12-29",
            "count": 1
          },
          {
            "date": "2016-01-06",
            "count": 1
          },
          {
            "date": "2016-01-07",
            "count": 1
          },
          {
            "date": "2016-01-13",
            "count": 1
          },
          {
            "date": "2016-02-11",
            "count": 1
          },
          {
            "date": "2016-02-15",
            "count": 1
          },
          {
            "date": "2016-02-22",
            "count": 1
          },
          {
            "date": "2016-02-24",
            "count": 1
          },
          {
            "date": "2016-02-27",
            "count": 1
          },
          {
            "date": "2016-03-07",
            "count": 1
          },
          {
            "date": "2016-03-17",
            "count": 1
          },
          {
            "date": "2016-03-30",
            "count": 1
          },
          {
            "date": "2016-04-29",
            "count": 1
          },
          {
            "date": "2016-05-05",
            "count": 1
          },
          {
            "date": "2016-05-13",
            "count": 1
          },
          {
            "date": "2016-05-30",
            "count": 1
          },
          {
            "date": "2016-06-22",
            "count": 1
          },
          {
            "date": "2016-06-28",
            "count": 1
          },
          {
            "date": "2016-07-06",
            "count": 1
          },
          {
            "date": "2016-07-31",
            "count": 1
          },
          {
            "date": "2016-08-11",
            "count": 1
          },
          {
            "date": "2016-09-17",
            "count": 1
          },
          {
            "date": "2016-09-19",
            "count": 1
          },
          {
            "date": "2016-09-20",
            "count": 1
          },
          {
            "date": "2016-09-27",
            "count": 1
          },
          {
            "date": "2016-10-18",
            "count": 1
          },
          {
            "date": "2016-10-22",
            "count": 1
          },
          {
            "date": "2016-10-25",
            "count": 1
          },
          {
            "date": "2016-10-28",
            "count": 1
          },
          {
            "date": "2016-11-04",
            "count": 1
          },
          {
            "date": "2016-12-16",
            "count": 1
          },
          {
            "date": "2017-01-11",
            "count": 1
          },
          {
            "date": "2017-03-09",
            "count": 1
          },
          {
            "date": "2017-04-07",
            "count": 1
          },
          {
            "date": "2017-04-27",
            "count": 1
          },
          {
            "date": "2017-04-30",
            "count": 1
          },
          {
            "date": "2017-05-04",
            "count": 1
          },
          {
            "date": "2017-05-10",
            "count": 1
          },
          {
            "date": "2017-05-20",
            "count": 2
          },
          {
            "date": "2017-06-01",
            "count": 1
          },
          {
            "date": "2017-06-06",
            "count": 1
          },
          {
            "date": "2017-06-14",
            "count": 1
          },
          {
            "date": "2017-06-20",
            "count": 1
          },
          {
            "date": "2017-07-03",
            "count": 1
          },
          {
            "date": "2017-08-07",
            "count": 1
          },
          {
            "date": "2017-08-11",
            "count": 1
          },
          {
            "date": "2017-08-15",
            "count": 1
          },
          {
            "date": "2017-08-28",
            "count": 1
          },
          {
            "date": "2017-08-29",
            "count": 1
          },
          {
            "date": "2017-08-30",
            "count": 1
          },
          {
            "date": "2017-09-04",
            "count": 1
          },
          {
            "date": "2017-09-07",
            "count": 1
          },
          {
            "date": "2017-09-22",
            "count": 1
          },
          {
            "date": "2017-09-23",
            "count": 1
          },
          {
            "date": "2017-10-04",
            "count": 1
          },
          {
            "date": "2017-10-10",
            "count": 2
          },
          {
            "date": "2017-10-13",
            "count": 1
          },
          {
            "date": "2017-10-16",
            "count": 1
          },
          {
            "date": "2017-11-14",
            "count": 1
          },
          {
            "date": "2017-12-05",
            "count": 2
          },
          {
            "date": "2017-12-10",
            "count": 1
          },
          {
            "date": "2017-12-11",
            "count": 1
          },
          {
            "date": "2017-12-26",
            "count": 2
          },
          {
            "date": "2017-12-27",
            "count": 1
          },
          {
            "date": "2018-01-02",
            "count": 1
          },
          {
            "date": "2018-01-05",
            "count": 1
          },
          {
            "date": "2018-01-07",
            "count": 1
          },
          {
            "date": "2018-01-10",
            "count": 1
          },
          {
            "date": "2018-01-25",
            "count": 1
          },
          {
            "date": "2018-02-06",
            "count": 1
          },
          {
            "date": "2018-02-15",
            "count": 1
          },
          {
            "date": "2018-03-07",
            "count": 1
          },
          {
            "date": "2018-03-15",
            "count": 2
          },
          {
            "date": "2018-03-28",
            "count": 1
          },
          {
            "date": "2018-04-02",
            "count": 1
          },
          {
            "date": "2018-04-04",
            "count": 1
          },
          {
            "date": "2018-04-10",
            "count": 1
          },
          {
            "date": "2018-04-13",
            "count": 1
          },
          {
            "date": "2018-04-16",
            "count": 1
          },
          {
            "date": "2018-04-17",
            "count": 1
          },
          {
            "date": "2018-04-24",
            "count": 1
          },
          {
            "date": "2018-05-02",
            "count": 1
          },
          {
            "date": "2018-05-07",
            "count": 1
          },
          {
            "date": "2018-05-09",
            "count": 1
          },
          {
            "date": "2018-05-17",
            "count": 1
          },
          {
            "date": "2018-05-22",
            "count": 1
          },
          {
            "date": "2018-05-28",
            "count": 1
          },
          {
            "date": "2018-06-14",
            "count": 1
          },
          {
            "date": "2018-06-26",
            "count": 1
          },
          {
            "date": "2018-07-17",
            "count": 1
          },
          {
            "date": "2018-07-19",
            "count": 1
          },
          {
            "date": "2018-08-02",
            "count": 1
          },
          {
            "date": "2018-08-12",
            "count": 1
          },
          {
            "date": "2018-08-16",
            "count": 1
          },
          {
            "date": "2018-08-27",
            "count": 1
          },
          {
            "date": "2018-08-30",
            "count": 1
          },
          {
            "date": "2018-10-08",
            "count": 1
          },
          {
            "date": "2018-10-25",
            "count": 1
          },
          {
            "date": "2018-11-17",
            "count": 1
          },
          {
            "date": "2018-12-16",
            "count": 1
          },
          {
            "date": "2018-12-20",
            "count": 1
          },
          {
            "date": "2019-02-12",
            "count": 1
          },
          {
            "date": "2019-02-19",
            "count": 1
          },
          {
            "date": "2019-03-16",
            "count": 1
          },
          {
            "date": "2019-04-21",
            "count": 2
          },
          {
            "date": "2019-04-23",
            "count": 1
          },
          {
            "date": "2019-06-17",
            "count": 1
          },
          {
            "date": "2019-06-25",
            "count": 1
          },
          {
            "date": "2019-07-10",
            "count": 1
          },
          {
            "date": "2019-07-27",
            "count": 1
          },
          {
            "date": "2019-08-12",
            "count": 1
          },
          {
            "date": "2019-08-15",
            "count": 1
          },
          {
            "date": "2019-10-13",
            "count": 1
          },
          {
            "date": "2019-10-16",
            "count": 1
          },
          {
            "date": "2019-10-18",
            "count": 1
          },
          {
            "date": "2019-11-14",
            "count": 1
          },
          {
            "date": "2019-11-19",
            "count": 1
          },
          {
            "date": "2019-11-27",
            "count": 1
          },
          {
            "date": "2019-12-18",
            "count": 1
          },
          {
            "date": "2019-12-27",
            "count": 1
          },
          {
            "date": "2020-01-30",
            "count": 1
          },
          {
            "date": "2020-02-24",
            "count": 1
          },
          {
            "date": "2020-04-06",
            "count": 1
          },
          {
            "date": "2020-04-20",
            "count": 1
          },
          {
            "date": "2020-04-24",
            "count": 1
          },
          {
            "date": "2020-07-08",
            "count": 1
          },
          {
            "date": "2020-07-09",
            "count": 1
          },
          {
            "date": "2020-07-22",
            "count": 1
          },
          {
            "date": "2020-07-30",
            "count": 1
          },
          {
            "date": "2020-08-04",
            "count": 1
          },
          {
            "date": "2020-09-01",
            "count": 1
          },
          {
            "date": "2020-09-17",
            "count": 2
          },
          {
            "date": "2020-09-23",
            "count": 2
          },
          {
            "date": "2020-10-20",
            "count": 1
          },
          {
            "date": "2020-10-26",
            "count": 1
          },
          {
            "date": "2021-01-04",
            "count": 1
          },
          {
            "date": "2021-01-21",
            "count": 1
          },
          {
            "date": "2021-01-29",
            "count": 1
          },
          {
            "date": "2021-01-30",
            "count": 1
          },
          {
            "date": "2021-03-03",
            "count": 1
          },
          {
            "date": "2021-04-16",
            "count": 2
          },
          {
            "date": "2021-04-28",
            "count": 1
          },
          {
            "date": "2021-04-29",
            "count": 1
          },
          {
            "date": "2021-05-10",
            "count": 2
          },
          {
            "date": "2021-05-26",
            "count": 1
          },
          {
            "date": "2021-05-31",
            "count": 1
          },
          {
            "date": "2021-07-13",
            "count": 1
          },
          {
            "date": "2021-08-05",
            "count": 1
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-08-24",
            "count": 1
          },
          {
            "date": "2021-11-10",
            "count": 1
          },
          {
            "date": "2021-11-19",
            "count": 1
          },
          {
            "date": "2021-11-21",
            "count": 1
          },
          {
            "date": "2021-11-25",
            "count": 1
          },
          {
            "date": "2021-12-25",
            "count": 1
          },
          {
            "date": "2021-12-28",
            "count": 2
          },
          {
            "date": "2021-12-30",
            "count": 1
          },
          {
            "date": "2022-02-09",
            "count": 1
          },
          {
            "date": "2022-03-04",
            "count": 1
          },
          {
            "date": "2022-03-25",
            "count": 1
          },
          {
            "date": "2022-04-26",
            "count": 1
          },
          {
            "date": "2022-05-19",
            "count": 1
          },
          {
            "date": "2022-06-10",
            "count": 1
          },
          {
            "date": "2022-07-10",
            "count": 1
          },
          {
            "date": "2022-09-01",
            "count": 1
          },
          {
            "date": "2022-09-05",
            "count": 1
          },
          {
            "date": "2022-09-29",
            "count": 1
          },
          {
            "date": "2022-10-31",
            "count": 1
          },
          {
            "date": "2022-11-05",
            "count": 1
          },
          {
            "date": "2022-12-07",
            "count": 1
          },
          {
            "date": "2023-01-01",
            "count": 1
          },
          {
            "date": "2023-01-25",
            "count": 1
          },
          {
            "date": "2023-02-02",
            "count": 1
          },
          {
            "date": "2023-02-20",
            "count": 1
          },
          {
            "date": "2023-03-09",
            "count": 1
          },
          {
            "date": "2023-03-28",
            "count": 1
          },
          {
            "date": "2023-05-07",
            "count": 1
          },
          {
            "date": "2023-05-10",
            "count": 1
          },
          {
            "date": "2023-05-29",
            "count": 1
          },
          {
            "date": "2023-07-12",
            "count": 1
          },
          {
            "date": "2023-07-27",
            "count": 1
          },
          {
            "date": "2023-08-27",
            "count": 1
          },
          {
            "date": "2023-09-08",
            "count": 1
          },
          {
            "date": "2024-01-17",
            "count": 1
          },
          {
            "date": "2024-02-28",
            "count": 1
          },
          {
            "date": "2024-04-23",
            "count": 1
          },
          {
            "date": "2024-05-05",
            "count": 1
          },
          {
            "date": "2024-05-30",
            "count": 1
          },
          {
            "date": "2024-06-11",
            "count": 1
          },
          {
            "date": "2024-08-01",
            "count": 2
          },
          {
            "date": "2024-10-18",
            "count": 1
          },
          {
            "date": "2024-10-29",
            "count": 1
          },
          {
            "date": "2024-12-12",
            "count": 1
          },
          {
            "date": "2025-02-07",
            "count": 1
          },
          {
            "date": "2025-04-08",
            "count": 1
          },
          {
            "date": "2025-04-15",
            "count": 1
          },
          {
            "date": "2025-04-25",
            "count": 1
          },
          {
            "date": "2025-06-25",
            "count": 1
          },
          {
            "date": "2025-07-06",
            "count": 1
          },
          {
            "date": "2025-07-15",
            "count": 1
          },
          {
            "date": "2025-10-17",
            "count": 1
          },
          {
            "date": "2025-10-26",
            "count": 1
          },
          {
            "date": "2025-12-11",
            "count": 1
          },
          {
            "date": "2026-01-02",
            "count": 1
          },
          {
            "date": "2026-02-09",
            "count": 1
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-30",
            "count": 1
          },
          {
            "date": "2026-04-09",
            "count": 1
          },
          {
            "date": "2026-04-28",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 450,
        "total_forks": 472
      },
      "star_history": {
        "days": [
          {
            "date": "2020-03-25",
            "count": 1
          },
          {
            "date": "2020-03-31",
            "count": 1
          },
          {
            "date": "2020-04-01",
            "count": 2
          },
          {
            "date": "2020-04-04",
            "count": 1
          },
          {
            "date": "2020-04-06",
            "count": 1
          },
          {
            "date": "2020-04-08",
            "count": 2
          },
          {
            "date": "2020-04-09",
            "count": 1
          },
          {
            "date": "2020-04-11",
            "count": 1
          },
          {
            "date": "2020-04-13",
            "count": 1
          },
          {
            "date": "2020-04-17",
            "count": 2
          },
          {
            "date": "2020-04-23",
            "count": 1
          },
          {
            "date": "2020-04-27",
            "count": 1
          },
          {
            "date": "2020-04-28",
            "count": 2
          },
          {
            "date": "2020-04-29",
            "count": 1
          },
          {
            "date": "2020-05-08",
            "count": 1
          },
          {
            "date": "2020-05-12",
            "count": 2
          },
          {
            "date": "2020-05-17",
            "count": 1
          },
          {
            "date": "2020-05-18",
            "count": 2
          },
          {
            "date": "2020-05-19",
            "count": 1
          },
          {
            "date": "2020-05-20",
            "count": 1
          },
          {
            "date": "2020-05-26",
            "count": 1
          },
          {
            "date": "2020-05-28",
            "count": 1
          },
          {
            "date": "2020-05-29",
            "count": 2
          },
          {
            "date": "2020-05-30",
            "count": 2
          },
          {
            "date": "2020-05-31",
            "count": 1
          },
          {
            "date": "2020-06-01",
            "count": 1
          },
          {
            "date": "2020-06-04",
            "count": 1
          },
          {
            "date": "2020-06-07",
            "count": 1
          },
          {
            "date": "2020-06-09",
            "count": 4
          },
          {
            "date": "2020-06-10",
            "count": 2
          },
          {
            "date": "2020-06-13",
            "count": 1
          },
          {
            "date": "2020-06-17",
            "count": 1
          },
          {
            "date": "2020-06-20",
            "count": 2
          },
          {
            "date": "2020-06-21",
            "count": 2
          },
          {
            "date": "2020-06-23",
            "count": 1
          },
          {
            "date": "2020-06-24",
            "count": 3
          },
          {
            "date": "2020-06-25",
            "count": 1
          },
          {
            "date": "2020-06-27",
            "count": 1
          },
          {
            "date": "2020-07-01",
            "count": 1
          },
          {
            "date": "2020-07-02",
            "count": 1
          },
          {
            "date": "2020-07-06",
            "count": 1
          },
          {
            "date": "2020-07-07",
            "count": 1
          },
          {
            "date": "2020-07-08",
            "count": 2
          },
          {
            "date": "2020-07-10",
            "count": 1
          },
          {
            "date": "2020-07-11",
            "count": 1
          },
          {
            "date": "2020-07-13",
            "count": 1
          },
          {
            "date": "2020-07-14",
            "count": 1
          },
          {
            "date": "2020-07-15",
            "count": 4
          },
          {
            "date": "2020-07-21",
            "count": 4
          },
          {
            "date": "2020-07-27",
            "count": 1
          },
          {
            "date": "2020-08-04",
            "count": 1
          },
          {
            "date": "2020-08-06",
            "count": 14
          },
          {
            "date": "2020-08-07",
            "count": 15
          },
          {
            "date": "2020-08-08",
            "count": 5
          },
          {
            "date": "2020-08-09",
            "count": 5
          },
          {
            "date": "2020-08-10",
            "count": 3
          },
          {
            "date": "2020-08-11",
            "count": 6
          },
          {
            "date": "2020-08-12",
            "count": 3
          },
          {
            "date": "2020-08-13",
            "count": 2
          },
          {
            "date": "2020-08-15",
            "count": 1
          },
          {
            "date": "2020-08-19",
            "count": 2
          },
          {
            "date": "2020-08-20",
            "count": 4
          },
          {
            "date": "2020-08-21",
            "count": 1
          },
          {
            "date": "2020-08-23",
            "count": 2
          },
          {
            "date": "2020-08-24",
            "count": 1
          },
          {
            "date": "2020-08-27",
            "count": 2
          },
          {
            "date": "2020-08-28",
            "count": 1
          },
          {
            "date": "2020-08-29",
            "count": 1
          },
          {
            "date": "2020-09-02",
            "count": 1
          },
          {
            "date": "2020-09-03",
            "count": 3
          },
          {
            "date": "2020-09-04",
            "count": 1
          },
          {
            "date": "2020-09-06",
            "count": 1
          },
          {
            "date": "2020-09-07",
            "count": 1
          },
          {
            "date": "2020-09-08",
            "count": 1
          },
          {
            "date": "2020-09-09",
            "count": 1
          },
          {
            "date": "2020-09-10",
            "count": 2
          },
          {
            "date": "2020-09-16",
            "count": 1
          },
          {
            "date": "2020-09-17",
            "count": 1
          },
          {
            "date": "2020-09-19",
            "count": 1
          },
          {
            "date": "2020-09-22",
            "count": 1
          },
          {
            "date": "2020-09-26",
            "count": 1
          },
          {
            "date": "2020-09-27",
            "count": 1
          },
          {
            "date": "2020-09-29",
            "count": 1
          },
          {
            "date": "2020-09-30",
            "count": 2
          },
          {
            "date": "2020-10-05",
            "count": 2
          },
          {
            "date": "2020-10-06",
            "count": 1
          },
          {
            "date": "2020-10-07",
            "count": 1
          },
          {
            "date": "2020-10-12",
            "count": 1
          },
          {
            "date": "2020-10-13",
            "count": 1
          },
          {
            "date": "2020-10-15",
            "count": 4
          },
          {
            "date": "2020-10-18",
            "count": 1
          },
          {
            "date": "2020-10-19",
            "count": 8
          },
          {
            "date": "2020-10-20",
            "count": 1
          },
          {
            "date": "2020-10-21",
            "count": 5
          },
          {
            "date": "2020-10-24",
            "count": 1
          },
          {
            "date": "2020-10-29",
            "count": 3
          },
          {
            "date": "2020-11-01",
            "count": 1
          },
          {
            "date": "2020-11-03",
            "count": 1
          },
          {
            "date": "2020-11-05",
            "count": 2
          },
          {
            "date": "2020-11-06",
            "count": 2
          },
          {
            "date": "2020-11-08",
            "count": 1
          },
          {
            "date": "2020-11-09",
            "count": 2
          },
          {
            "date": "2020-11-10",
            "count": 1
          },
          {
            "date": "2020-11-11",
            "count": 1
          },
          {
            "date": "2020-11-12",
            "count": 2
          },
          {
            "date": "2020-11-14",
            "count": 1
          },
          {
            "date": "2020-11-18",
            "count": 1
          },
          {
            "date": "2020-11-20",
            "count": 1
          },
          {
            "date": "2020-12-02",
            "count": 2
          },
          {
            "date": "2020-12-08",
            "count": 4
          },
          {
            "date": "2020-12-09",
            "count": 3
          },
          {
            "date": "2020-12-12",
            "count": 1
          },
          {
            "date": "2020-12-13",
            "count": 2
          },
          {
            "date": "2020-12-14",
            "count": 1
          },
          {
            "date": "2020-12-15",
            "count": 1
          },
          {
            "date": "2020-12-17",
            "count": 1
          },
          {
            "date": "2020-12-24",
            "count": 2
          },
          {
            "date": "2020-12-26",
            "count": 1
          },
          {
            "date": "2021-01-03",
            "count": 1
          },
          {
            "date": "2021-01-07",
            "count": 1
          },
          {
            "date": "2021-01-10",
            "count": 1
          },
          {
            "date": "2021-01-15",
            "count": 1
          },
          {
            "date": "2021-01-19",
            "count": 1
          },
          {
            "date": "2021-01-20",
            "count": 1
          },
          {
            "date": "2021-01-21",
            "count": 1
          },
          {
            "date": "2021-01-22",
            "count": 2
          },
          {
            "date": "2021-01-24",
            "count": 1
          },
          {
            "date": "2021-01-27",
            "count": 3
          },
          {
            "date": "2021-01-29",
            "count": 1
          },
          {
            "date": "2021-01-30",
            "count": 1
          },
          {
            "date": "2021-02-01",
            "count": 2
          },
          {
            "date": "2021-02-03",
            "count": 2
          },
          {
            "date": "2021-02-05",
            "count": 1
          },
          {
            "date": "2021-02-07",
            "count": 2
          },
          {
            "date": "2021-02-09",
            "count": 1
          },
          {
            "date": "2021-02-11",
            "count": 1
          },
          {
            "date": "2021-02-12",
            "count": 1
          },
          {
            "date": "2021-02-13",
            "count": 1
          },
          {
            "date": "2021-02-15",
            "count": 1
          },
          {
            "date": "2021-02-18",
            "count": 1
          },
          {
            "date": "2021-02-19",
            "count": 1
          },
          {
            "date": "2021-02-22",
            "count": 1
          },
          {
            "date": "2021-02-24",
            "count": 1
          },
          {
            "date": "2021-02-25",
            "count": 1
          },
          {
            "date": "2021-02-27",
            "count": 1
          },
          {
            "date": "2021-03-01",
            "count": 1
          },
          {
            "date": "2021-03-02",
            "count": 1
          },
          {
            "date": "2021-03-03",
            "count": 1
          },
          {
            "date": "2021-03-05",
            "count": 1
          },
          {
            "date": "2021-03-07",
            "count": 1
          },
          {
            "date": "2021-03-09",
            "count": 1
          },
          {
            "date": "2021-03-11",
            "count": 2
          },
          {
            "date": "2021-03-12",
            "count": 2
          },
          {
            "date": "2021-03-14",
            "count": 1
          },
          {
            "date": "2021-03-19",
            "count": 2
          },
          {
            "date": "2021-03-22",
            "count": 2
          },
          {
            "date": "2021-03-26",
            "count": 1
          },
          {
            "date": "2021-04-01",
            "count": 1
          },
          {
            "date": "2021-04-09",
            "count": 2
          },
          {
            "date": "2021-04-13",
            "count": 1
          },
          {
            "date": "2021-04-15",
            "count": 13
          },
          {
            "date": "2021-04-16",
            "count": 9
          },
          {
            "date": "2021-04-17",
            "count": 3
          },
          {
            "date": "2021-04-18",
            "count": 3
          },
          {
            "date": "2021-04-19",
            "count": 2
          },
          {
            "date": "2021-04-20",
            "count": 2
          },
          {
            "date": "2021-04-22",
            "count": 1
          },
          {
            "date": "2021-04-23",
            "count": 1
          },
          {
            "date": "2021-04-26",
            "count": 1
          },
          {
            "date": "2021-04-29",
            "count": 1
          },
          {
            "date": "2021-05-03",
            "count": 1
          },
          {
            "date": "2021-05-06",
            "count": 1
          },
          {
            "date": "2021-05-10",
            "count": 1
          },
          {
            "date": "2021-05-11",
            "count": 1
          },
          {
            "date": "2021-05-12",
            "count": 3
          },
          {
            "date": "2021-05-20",
            "count": 1
          },
          {
            "date": "2021-05-24",
            "count": 2
          },
          {
            "date": "2021-05-30",
            "count": 1
          },
          {
            "date": "2021-06-09",
            "count": 1
          },
          {
            "date": "2021-06-13",
            "count": 1
          },
          {
            "date": "2021-06-14",
            "count": 1
          },
          {
            "date": "2021-06-18",
            "count": 1
          },
          {
            "date": "2021-06-23",
            "count": 1
          },
          {
            "date": "2021-06-24",
            "count": 1
          },
          {
            "date": "2021-06-29",
            "count": 2
          },
          {
            "date": "2021-06-30",
            "count": 2
          },
          {
            "date": "2021-07-02",
            "count": 1
          },
          {
            "date": "2021-07-04",
            "count": 1
          },
          {
            "date": "2021-07-06",
            "count": 2
          },
          {
            "date": "2021-07-08",
            "count": 2
          },
          {
            "date": "2021-07-10",
            "count": 1
          },
          {
            "date": "2021-07-12",
            "count": 1
          },
          {
            "date": "2021-07-14",
            "count": 1
          },
          {
            "date": "2021-07-15",
            "count": 1
          },
          {
            "date": "2021-07-16",
            "count": 1
          },
          {
            "date": "2021-07-21",
            "count": 2
          },
          {
            "date": "2021-07-31",
            "count": 1
          },
          {
            "date": "2021-08-01",
            "count": 1
          },
          {
            "date": "2021-08-03",
            "count": 1
          },
          {
            "date": "2021-08-05",
            "count": 1
          },
          {
            "date": "2021-08-09",
            "count": 2
          },
          {
            "date": "2021-08-10",
            "count": 1
          },
          {
            "date": "2021-08-12",
            "count": 1
          },
          {
            "date": "2021-08-15",
            "count": 3
          },
          {
            "date": "2021-08-16",
            "count": 1
          },
          {
            "date": "2021-08-18",
            "count": 1
          },
          {
            "date": "2021-08-19",
            "count": 5
          },
          {
            "date": "2021-08-22",
            "count": 1
          },
          {
            "date": "2021-08-23",
            "count": 1
          },
          {
            "date": "2021-08-24",
            "count": 1
          },
          {
            "date": "2021-08-26",
            "count": 2
          },
          {
            "date": "2021-08-27",
            "count": 1
          },
          {
            "date": "2021-08-28",
            "count": 1
          },
          {
            "date": "2021-08-31",
            "count": 1
          },
          {
            "date": "2021-09-02",
            "count": 1
          },
          {
            "date": "2021-09-08",
            "count": 2
          },
          {
            "date": "2021-09-11",
            "count": 1
          },
          {
            "date": "2021-09-16",
            "count": 1
          },
          {
            "date": "2021-09-23",
            "count": 1
          },
          {
            "date": "2021-09-28",
            "count": 1
          },
          {
            "date": "2021-10-06",
            "count": 1
          },
          {
            "date": "2021-10-15",
            "count": 1
          },
          {
            "date": "2021-10-19",
            "count": 1
          },
          {
            "date": "2021-10-24",
            "count": 1
          },
          {
            "date": "2021-10-28",
            "count": 1
          },
          {
            "date": "2021-11-01",
            "count": 1
          },
          {
            "date": "2021-11-03",
            "count": 1
          },
          {
            "date": "2021-11-08",
            "count": 1
          },
          {
            "date": "2021-11-09",
            "count": 2
          },
          {
            "date": "2021-11-12",
            "count": 1
          },
          {
            "date": "2021-11-15",
            "count": 2
          },
          {
            "date": "2021-11-18",
            "count": 2
          },
          {
            "date": "2021-11-23",
            "count": 1
          },
          {
            "date": "2021-11-24",
            "count": 1
          },
          {
            "date": "2021-11-25",
            "count": 1
          },
          {
            "date": "2021-11-28",
            "count": 1
          },
          {
            "date": "2021-11-30",
            "count": 4
          },
          {
            "date": "2021-12-04",
            "count": 1
          },
          {
            "date": "2021-12-06",
            "count": 1
          },
          {
            "date": "2021-12-08",
            "count": 1
          },
          {
            "date": "2021-12-10",
            "count": 1
          },
          {
            "date": "2021-12-13",
            "count": 1
          },
          {
            "date": "2021-12-14",
            "count": 1
          },
          {
            "date": "2021-12-24",
            "count": 1
          },
          {
            "date": "2021-12-28",
            "count": 1
          },
          {
            "date": "2022-01-01",
            "count": 1
          },
          {
            "date": "2022-01-05",
            "count": 1
          },
          {
            "date": "2022-01-06",
            "count": 1
          },
          {
            "date": "2022-01-09",
            "count": 1
          },
          {
            "date": "2022-01-10",
            "count": 1
          },
          {
            "date": "2022-01-13",
            "count": 1
          },
          {
            "date": "2022-01-19",
            "count": 1
          },
          {
            "date": "2022-01-24",
            "count": 1
          },
          {
            "date": "2022-02-03",
            "count": 1
          },
          {
            "date": "2022-02-12",
            "count": 1
          },
          {
            "date": "2022-02-15",
            "count": 1
          },
          {
            "date": "2022-02-16",
            "count": 1
          },
          {
            "date": "2022-02-17",
            "count": 1
          },
          {
            "date": "2022-02-18",
            "count": 1
          },
          {
            "date": "2022-02-21",
            "count": 1
          },
          {
            "date": "2022-02-22",
            "count": 3
          },
          {
            "date": "2022-02-27",
            "count": 1
          },
          {
            "date": "2022-03-06",
            "count": 1
          },
          {
            "date": "2022-03-10",
            "count": 1
          },
          {
            "date": "2022-03-11",
            "count": 1
          },
          {
            "date": "2022-03-16",
            "count": 1
          },
          {
            "date": "2022-03-18",
            "count": 1
          },
          {
            "date": "2022-03-22",
            "count": 1
          },
          {
            "date": "2022-03-29",
            "count": 1
          },
          {
            "date": "2022-04-04",
            "count": 1
          },
          {
            "date": "2022-04-05",
            "count": 1
          },
          {
            "date": "2022-04-07",
            "count": 1
          },
          {
            "date": "2022-04-08",
            "count": 1
          },
          {
            "date": "2022-04-09",
            "count": 1
          },
          {
            "date": "2022-04-17",
            "count": 1
          },
          {
            "date": "2022-04-21",
            "count": 1
          },
          {
            "date": "2022-04-22",
            "count": 1
          },
          {
            "date": "2022-04-25",
            "count": 1
          },
          {
            "date": "2022-04-26",
            "count": 1
          },
          {
            "date": "2022-04-28",
            "count": 1
          },
          {
            "date": "2022-04-29",
            "count": 2
          },
          {
            "date": "2022-05-03",
            "count": 1
          },
          {
            "date": "2022-05-05",
            "count": 1
          },
          {
            "date": "2022-05-08",
            "count": 1
          },
          {
            "date": "2022-05-09",
            "count": 1
          },
          {
            "date": "2022-05-10",
            "count": 1
          },
          {
            "date": "2022-05-12",
            "count": 1
          },
          {
            "date": "2022-05-13",
            "count": 1
          },
          {
            "date": "2022-05-18",
            "count": 1
          },
          {
            "date": "2022-05-20",
            "count": 1
          },
          {
            "date": "2022-05-21",
            "count": 1
          },
          {
            "date": "2022-05-25",
            "count": 1
          },
          {
            "date": "2022-06-02",
            "count": 1
          },
          {
            "date": "2022-06-03",
            "count": 1
          },
          {
            "date": "2022-06-04",
            "count": 1
          },
          {
            "date": "2022-06-09",
            "count": 1
          },
          {
            "date": "2022-06-10",
            "count": 1
          },
          {
            "date": "2022-06-13",
            "count": 1
          },
          {
            "date": "2022-06-15",
            "count": 1
          },
          {
            "date": "2022-06-16",
            "count": 3
          },
          {
            "date": "2022-06-17",
            "count": 5
          },
          {
            "date": "2022-06-18",
            "count": 1
          },
          {
            "date": "2022-06-19",
            "count": 1
          },
          {
            "date": "2022-06-20",
            "count": 4
          },
          {
            "date": "2022-06-22",
            "count": 2
          },
          {
            "date": "2022-06-24",
            "count": 1
          },
          {
            "date": "2022-06-27",
            "count": 1
          },
          {
            "date": "2022-06-29",
            "count": 2
          },
          {
            "date": "2022-06-30",
            "count": 1
          },
          {
            "date": "2022-07-03",
            "count": 1
          },
          {
            "date": "2022-07-08",
            "count": 1
          },
          {
            "date": "2022-07-09",
            "count": 1
          },
          {
            "date": "2022-07-12",
            "count": 3
          },
          {
            "date": "2022-07-13",
            "count": 4
          },
          {
            "date": "2022-07-22",
            "count": 1
          },
          {
            "date": "2022-07-23",
            "count": 1
          },
          {
            "date": "2022-07-29",
            "count": 1
          },
          {
            "date": "2022-07-31",
            "count": 1
          },
          {
            "date": "2022-08-01",
            "count": 2
          },
          {
            "date": "2022-08-06",
            "count": 1
          },
          {
            "date": "2022-08-07",
            "count": 1
          },
          {
            "date": "2022-08-09",
            "count": 1
          },
          {
            "date": "2022-08-10",
            "count": 1
          },
          {
            "date": "2022-08-12",
            "count": 1
          },
          {
            "date": "2022-08-16",
            "count": 1
          },
          {
            "date": "2022-08-20",
            "count": 1
          },
          {
            "date": "2022-08-23",
            "count": 1
          },
          {
            "date": "2022-08-25",
            "count": 1
          },
          {
            "date": "2022-08-27",
            "count": 1
          },
          {
            "date": "2022-09-02",
            "count": 2
          },
          {
            "date": "2022-09-06",
            "count": 1
          },
          {
            "date": "2022-09-08",
            "count": 2
          },
          {
            "date": "2022-09-15",
            "count": 1
          },
          {
            "date": "2022-09-16",
            "count": 1
          },
          {
            "date": "2022-09-27",
            "count": 1
          },
          {
            "date": "2022-10-01",
            "count": 1
          },
          {
            "date": "2022-10-05",
            "count": 1
          },
          {
            "date": "2022-10-12",
            "count": 1
          },
          {
            "date": "2022-10-14",
            "count": 1
          },
          {
            "date": "2022-10-17",
            "count": 1
          },
          {
            "date": "2022-10-19",
            "count": 1
          },
          {
            "date": "2022-10-20",
            "count": 1
          },
          {
            "date": "2022-10-22",
            "count": 1
          },
          {
            "date": "2022-11-06",
            "count": 1
          },
          {
            "date": "2022-11-08",
            "count": 1
          },
          {
            "date": "2022-11-09",
            "count": 1
          },
          {
            "date": "2022-11-11",
            "count": 1
          },
          {
            "date": "2022-11-12",
            "count": 1
          },
          {
            "date": "2022-11-15",
            "count": 1
          },
          {
            "date": "2022-11-16",
            "count": 1
          },
          {
            "date": "2022-11-17",
            "count": 2
          },
          {
            "date": "2022-11-18",
            "count": 1
          },
          {
            "date": "2022-11-24",
            "count": 1
          },
          {
            "date": "2022-12-02",
            "count": 2
          },
          {
            "date": "2022-12-10",
            "count": 2
          },
          {
            "date": "2022-12-16",
            "count": 2
          },
          {
            "date": "2022-12-19",
            "count": 2
          },
          {
            "date": "2022-12-25",
            "count": 1
          },
          {
            "date": "2022-12-29",
            "count": 1
          },
          {
            "date": "2022-12-30",
            "count": 1
          },
          {
            "date": "2023-01-01",
            "count": 2
          },
          {
            "date": "2023-01-04",
            "count": 1
          },
          {
            "date": "2023-01-05",
            "count": 2
          },
          {
            "date": "2023-01-08",
            "count": 1
          },
          {
            "date": "2023-01-13",
            "count": 1
          },
          {
            "date": "2023-01-15",
            "count": 1
          },
          {
            "date": "2023-01-17",
            "count": 2
          },
          {
            "date": "2023-01-18",
            "count": 1
          },
          {
            "date": "2023-01-19",
            "count": 2
          },
          {
            "date": "2023-01-24",
            "count": 1
          },
          {
            "date": "2023-01-25",
            "count": 1
          },
          {
            "date": "2023-01-27",
            "count": 1
          },
          {
            "date": "2023-01-29",
            "count": 1
          },
          {
            "date": "2023-01-30",
            "count": 1
          },
          {
            "date": "2023-02-01",
            "count": 1
          },
          {
            "date": "2023-02-02",
            "count": 1
          },
          {
            "date": "2023-02-05",
            "count": 1
          },
          {
            "date": "2023-02-06",
            "count": 3
          },
          {
            "date": "2023-02-07",
            "count": 2
          },
          {
            "date": "2023-02-09",
            "count": 2
          },
          {
            "date": "2023-02-12",
            "count": 1
          },
          {
            "date": "2023-02-14",
            "count": 1
          },
          {
            "date": "2023-02-18",
            "count": 1
          },
          {
            "date": "2023-02-21",
            "count": 1
          },
          {
            "date": "2023-02-22",
            "count": 1
          },
          {
            "date": "2023-02-23",
            "count": 2
          },
          {
            "date": "2023-03-08",
            "count": 1
          },
          {
            "date": "2023-03-14",
            "count": 2
          },
          {
            "date": "2023-03-15",
            "count": 1
          },
          {
            "date": "2023-03-17",
            "count": 2
          },
          {
            "date": "2023-03-18",
            "count": 2
          },
          {
            "date": "2023-03-20",
            "count": 1
          },
          {
            "date": "2023-03-22",
            "count": 1
          },
          {
            "date": "2023-03-23",
            "count": 3
          },
          {
            "date": "2023-03-27",
            "count": 1
          },
          {
            "date": "2023-04-02",
            "count": 1
          },
          {
            "date": "2023-04-06",
            "count": 2
          },
          {
            "date": "2023-04-07",
            "count": 1
          },
          {
            "date": "2023-04-11",
            "count": 1
          },
          {
            "date": "2023-04-12",
            "count": 1
          },
          {
            "date": "2023-04-18",
            "count": 2
          },
          {
            "date": "2023-04-23",
            "count": 1
          },
          {
            "date": "2023-05-03",
            "count": 1
          },
          {
            "date": "2023-05-05",
            "count": 1
          },
          {
            "date": "2023-05-06",
            "count": 1
          },
          {
            "date": "2023-05-09",
            "count": 1
          },
          {
            "date": "2023-05-10",
            "count": 2
          },
          {
            "date": "2023-05-15",
            "count": 1
          },
          {
            "date": "2023-05-19",
            "count": 1
          },
          {
            "date": "2023-05-21",
            "count": 1
          },
          {
            "date": "2023-05-23",
            "count": 1
          },
          {
            "date": "2023-05-25",
            "count": 1
          },
          {
            "date": "2023-05-26",
            "count": 1
          },
          {
            "date": "2023-05-28",
            "count": 1
          },
          {
            "date": "2023-05-29",
            "count": 3
          },
          {
            "date": "2023-05-30",
            "count": 1
          },
          {
            "date": "2023-06-01",
            "count": 1
          },
          {
            "date": "2023-06-05",
            "count": 2
          },
          {
            "date": "2023-06-23",
            "count": 1
          },
          {
            "date": "2023-06-25",
            "count": 2
          },
          {
            "date": "2023-06-26",
            "count": 1
          },
          {
            "date": "2023-07-01",
            "count": 1
          },
          {
            "date": "2023-07-04",
            "count": 1
          },
          {
            "date": "2023-07-09",
            "count": 2
          },
          {
            "date": "2023-07-12",
            "count": 1
          },
          {
            "date": "2023-07-15",
            "count": 1
          },
          {
            "date": "2023-07-26",
            "count": 1
          },
          {
            "date": "2023-07-27",
            "count": 1
          },
          {
            "date": "2023-07-29",
            "count": 1
          },
          {
            "date": "2023-07-30",
            "count": 1
          },
          {
            "date": "2023-08-04",
            "count": 1
          },
          {
            "date": "2023-08-07",
            "count": 1
          },
          {
            "date": "2023-08-11",
            "count": 1
          },
          {
            "date": "2023-08-15",
            "count": 1
          },
          {
            "date": "2023-08-16",
            "count": 1
          },
          {
            "date": "2023-08-19",
            "count": 1
          },
          {
            "date": "2023-08-23",
            "count": 1
          },
          {
            "date": "2023-08-24",
            "count": 1
          },
          {
            "date": "2023-08-25",
            "count": 1
          },
          {
            "date": "2023-08-26",
            "count": 1
          },
          {
            "date": "2023-08-29",
            "count": 1
          },
          {
            "date": "2023-09-03",
            "count": 1
          },
          {
            "date": "2023-09-04",
            "count": 1
          },
          {
            "date": "2023-09-06",
            "count": 1
          },
          {
            "date": "2023-09-07",
            "count": 1
          },
          {
            "date": "2023-09-08",
            "count": 1
          },
          {
            "date": "2023-09-09",
            "count": 1
          },
          {
            "date": "2023-09-13",
            "count": 2
          },
          {
            "date": "2023-09-17",
            "count": 1
          },
          {
            "date": "2023-09-19",
            "count": 3
          },
          {
            "date": "2023-09-20",
            "count": 3
          },
          {
            "date": "2023-09-21",
            "count": 1
          },
          {
            "date": "2023-09-27",
            "count": 1
          },
          {
            "date": "2023-10-01",
            "count": 1
          },
          {
            "date": "2023-10-02",
            "count": 2
          },
          {
            "date": "2023-10-03",
            "count": 1
          },
          {
            "date": "2023-10-07",
            "count": 1
          },
          {
            "date": "2023-10-11",
            "count": 1
          },
          {
            "date": "2023-10-15",
            "count": 1
          },
          {
            "date": "2023-10-19",
            "count": 2
          },
          {
            "date": "2023-10-23",
            "count": 1
          },
          {
            "date": "2023-10-24",
            "count": 1
          },
          {
            "date": "2023-10-29",
            "count": 1
          },
          {
            "date": "2023-11-07",
            "count": 2
          },
          {
            "date": "2023-11-09",
            "count": 1
          },
          {
            "date": "2023-11-10",
            "count": 1
          },
          {
            "date": "2023-11-15",
            "count": 1
          },
          {
            "date": "2023-11-17",
            "count": 1
          },
          {
            "date": "2023-11-18",
            "count": 1
          },
          {
            "date": "2023-11-20",
            "count": 2
          },
          {
            "date": "2023-11-25",
            "count": 1
          },
          {
            "date": "2023-11-28",
            "count": 1
          },
          {
            "date": "2023-11-29",
            "count": 1
          },
          {
            "date": "2023-12-05",
            "count": 1
          },
          {
            "date": "2023-12-08",
            "count": 1
          },
          {
            "date": "2023-12-18",
            "count": 1
          },
          {
            "date": "2023-12-19",
            "count": 1
          },
          {
            "date": "2023-12-21",
            "count": 1
          },
          {
            "date": "2023-12-28",
            "count": 1
          },
          {
            "date": "2024-01-04",
            "count": 1
          },
          {
            "date": "2024-01-05",
            "count": 2
          },
          {
            "date": "2024-01-22",
            "count": 1
          },
          {
            "date": "2024-02-05",
            "count": 1
          },
          {
            "date": "2024-02-13",
            "count": 2
          },
          {
            "date": "2024-02-16",
            "count": 1
          },
          {
            "date": "2024-02-21",
            "count": 1
          },
          {
            "date": "2024-02-23",
            "count": 1
          },
          {
            "date": "2024-02-26",
            "count": 1
          },
          {
            "date": "2024-03-01",
            "count": 1
          },
          {
            "date": "2024-03-09",
            "count": 3
          },
          {
            "date": "2024-03-10",
            "count": 1
          },
          {
            "date": "2024-03-11",
            "count": 1
          },
          {
            "date": "2024-03-12",
            "count": 1
          },
          {
            "date": "2024-03-15",
            "count": 1
          },
          {
            "date": "2024-03-17",
            "count": 1
          },
          {
            "date": "2024-03-18",
            "count": 1
          },
          {
            "date": "2024-03-26",
            "count": 1
          },
          {
            "date": "2024-03-28",
            "count": 3
          },
          {
            "date": "2024-03-29",
            "count": 1
          },
          {
            "date": "2024-04-03",
            "count": 2
          },
          {
            "date": "2024-04-07",
            "count": 1
          },
          {
            "date": "2024-04-11",
            "count": 1
          },
          {
            "date": "2024-04-17",
            "count": 1
          },
          {
            "date": "2024-04-19",
            "count": 1
          },
          {
            "date": "2024-04-21",
            "count": 1
          },
          {
            "date": "2024-04-23",
            "count": 2
          },
          {
            "date": "2024-04-24",
            "count": 4
          },
          {
            "date": "2024-04-26",
            "count": 3
          },
          {
            "date": "2024-04-27",
            "count": 1
          },
          {
            "date": "2024-04-28",
            "count": 1
          },
          {
            "date": "2024-04-29",
            "count": 1
          },
          {
            "date": "2024-04-30",
            "count": 1
          },
          {
            "date": "2024-05-03",
            "count": 1
          },
          {
            "date": "2024-05-05",
            "count": 1
          },
          {
            "date": "2024-05-07",
            "count": 2
          },
          {
            "date": "2024-05-09",
            "count": 1
          },
          {
            "date": "2024-05-12",
            "count": 1
          },
          {
            "date": "2024-05-15",
            "count": 1
          },
          {
            "date": "2024-05-26",
            "count": 1
          },
          {
            "date": "2024-05-28",
            "count": 1
          },
          {
            "date": "2024-05-30",
            "count": 1
          },
          {
            "date": "2024-06-07",
            "count": 1
          },
          {
            "date": "2024-06-09",
            "count": 1
          },
          {
            "date": "2024-06-11",
            "count": 2
          },
          {
            "date": "2024-06-19",
            "count": 1
          },
          {
            "date": "2024-06-20",
            "count": 1
          },
          {
            "date": "2024-06-21",
            "count": 1
          },
          {
            "date": "2024-06-23",
            "count": 1
          },
          {
            "date": "2024-06-26",
            "count": 1
          },
          {
            "date": "2024-06-30",
            "count": 1
          },
          {
            "date": "2024-07-01",
            "count": 1
          },
          {
            "date": "2024-07-02",
            "count": 2
          },
          {
            "date": "2024-07-03",
            "count": 1
          },
          {
            "date": "2024-07-08",
            "count": 1
          },
          {
            "date": "2024-07-13",
            "count": 1
          },
          {
            "date": "2024-07-18",
            "count": 2
          },
          {
            "date": "2024-07-21",
            "count": 1
          },
          {
            "date": "2024-07-22",
            "count": 1
          },
          {
            "date": "2024-08-01",
            "count": 1
          },
          {
            "date": "2024-08-04",
            "count": 1
          },
          {
            "date": "2024-08-05",
            "count": 1
          },
          {
            "date": "2024-08-08",
            "count": 1
          },
          {
            "date": "2024-08-22",
            "count": 2
          },
          {
            "date": "2024-08-27",
            "count": 1
          },
          {
            "date": "2024-09-09",
            "count": 1
          },
          {
            "date": "2024-09-11",
            "count": 3
          },
          {
            "date": "2024-09-15",
            "count": 1
          },
          {
            "date": "2024-09-18",
            "count": 1
          },
          {
            "date": "2024-09-24",
            "count": 1
          },
          {
            "date": "2024-09-25",
            "count": 2
          },
          {
            "date": "2024-09-28",
            "count": 1
          },
          {
            "date": "2024-10-01",
            "count": 1
          },
          {
            "date": "2024-10-02",
            "count": 1
          },
          {
            "date": "2024-10-05",
            "count": 1
          },
          {
            "date": "2024-10-10",
            "count": 1
          },
          {
            "date": "2024-10-11",
            "count": 1
          },
          {
            "date": "2024-10-12",
            "count": 1
          },
          {
            "date": "2024-10-18",
            "count": 1
          },
          {
            "date": "2024-10-21",
            "count": 1
          },
          {
            "date": "2024-10-23",
            "count": 2
          },
          {
            "date": "2024-10-24",
            "count": 1
          },
          {
            "date": "2024-10-28",
            "count": 1
          },
          {
            "date": "2024-10-30",
            "count": 2
          },
          {
            "date": "2024-11-02",
            "count": 1
          },
          {
            "date": "2024-11-04",
            "count": 1
          },
          {
            "date": "2024-11-05",
            "count": 1
          },
          {
            "date": "2024-11-07",
            "count": 2
          },
          {
            "date": "2024-11-08",
            "count": 1
          },
          {
            "date": "2024-11-12",
            "count": 1
          },
          {
            "date": "2024-11-13",
            "count": 1
          },
          {
            "date": "2024-11-18",
            "count": 3
          },
          {
            "date": "2024-11-22",
            "count": 2
          },
          {
            "date": "2024-12-02",
            "count": 1
          },
          {
            "date": "2024-12-09",
            "count": 1
          },
          {
            "date": "2024-12-12",
            "count": 2
          },
          {
            "date": "2024-12-20",
            "count": 1
          },
          {
            "date": "2024-12-23",
            "count": 1
          },
          {
            "date": "2024-12-25",
            "count": 1
          },
          {
            "date": "2025-01-02",
            "count": 1
          },
          {
            "date": "2025-01-07",
            "count": 1
          },
          {
            "date": "2025-01-08",
            "count": 4
          },
          {
            "date": "2025-01-09",
            "count": 1
          },
          {
            "date": "2025-01-14",
            "count": 2
          },
          {
            "date": "2025-01-22",
            "count": 2
          },
          {
            "date": "2025-01-26",
            "count": 1
          },
          {
            "date": "2025-02-02",
            "count": 1
          },
          {
            "date": "2025-02-14",
            "count": 1
          },
          {
            "date": "2025-02-15",
            "count": 5
          },
          {
            "date": "2025-02-17",
            "count": 1
          },
          {
            "date": "2025-02-19",
            "count": 1
          },
          {
            "date": "2025-02-21",
            "count": 1
          },
          {
            "date": "2025-02-22",
            "count": 1
          },
          {
            "date": "2025-02-23",
            "count": 1
          },
          {
            "date": "2025-02-25",
            "count": 1
          },
          {
            "date": "2025-02-26",
            "count": 3
          },
          {
            "date": "2025-03-07",
            "count": 2
          },
          {
            "date": "2025-03-10",
            "count": 1
          },
          {
            "date": "2025-03-11",
            "count": 1
          },
          {
            "date": "2025-03-14",
            "count": 1
          },
          {
            "date": "2025-03-15",
            "count": 1
          },
          {
            "date": "2025-03-20",
            "count": 1
          },
          {
            "date": "2025-04-02",
            "count": 2
          },
          {
            "date": "2025-04-07",
            "count": 1
          },
          {
            "date": "2025-04-08",
            "count": 1
          },
          {
            "date": "2025-04-15",
            "count": 1
          },
          {
            "date": "2025-04-16",
            "count": 1
          },
          {
            "date": "2025-04-18",
            "count": 1
          },
          {
            "date": "2025-04-19",
            "count": 1
          },
          {
            "date": "2025-04-23",
            "count": 1
          },
          {
            "date": "2025-04-28",
            "count": 2
          },
          {
            "date": "2025-04-29",
            "count": 2
          },
          {
            "date": "2025-04-30",
            "count": 1
          },
          {
            "date": "2025-05-02",
            "count": 1
          },
          {
            "date": "2025-05-08",
            "count": 2
          },
          {
            "date": "2025-05-13",
            "count": 2
          },
          {
            "date": "2025-05-20",
            "count": 1
          },
          {
            "date": "2025-05-21",
            "count": 1
          },
          {
            "date": "2025-05-24",
            "count": 2
          },
          {
            "date": "2025-05-30",
            "count": 1
          },
          {
            "date": "2025-06-05",
            "count": 1
          },
          {
            "date": "2025-06-06",
            "count": 1
          },
          {
            "date": "2025-06-10",
            "count": 1
          },
          {
            "date": "2025-06-16",
            "count": 2
          },
          {
            "date": "2025-06-28",
            "count": 1
          },
          {
            "date": "2025-07-02",
            "count": 1
          },
          {
            "date": "2025-07-17",
            "count": 1
          },
          {
            "date": "2025-07-18",
            "count": 1
          },
          {
            "date": "2025-07-28",
            "count": 1
          },
          {
            "date": "2025-07-30",
            "count": 1
          },
          {
            "date": "2025-07-31",
            "count": 1
          },
          {
            "date": "2025-08-13",
            "count": 1
          },
          {
            "date": "2025-08-15",
            "count": 3
          },
          {
            "date": "2025-08-19",
            "count": 1
          },
          {
            "date": "2025-08-20",
            "count": 2
          },
          {
            "date": "2025-08-26",
            "count": 1
          },
          {
            "date": "2025-08-27",
            "count": 1
          },
          {
            "date": "2025-08-28",
            "count": 1
          },
          {
            "date": "2025-09-01",
            "count": 1
          },
          {
            "date": "2025-09-03",
            "count": 1
          },
          {
            "date": "2025-09-06",
            "count": 1
          },
          {
            "date": "2025-09-09",
            "count": 1
          },
          {
            "date": "2025-09-22",
            "count": 1
          },
          {
            "date": "2025-10-08",
            "count": 2
          },
          {
            "date": "2025-10-26",
            "count": 1
          },
          {
            "date": "2025-10-27",
            "count": 1
          },
          {
            "date": "2025-10-30",
            "count": 1
          },
          {
            "date": "2025-11-03",
            "count": 1
          },
          {
            "date": "2025-11-19",
            "count": 1
          },
          {
            "date": "2025-12-01",
            "count": 1
          },
          {
            "date": "2025-12-02",
            "count": 1
          },
          {
            "date": "2025-12-03",
            "count": 1
          },
          {
            "date": "2025-12-06",
            "count": 1
          },
          {
            "date": "2025-12-17",
            "count": 1
          },
          {
            "date": "2025-12-20",
            "count": 1
          },
          {
            "date": "2025-12-27",
            "count": 1
          },
          {
            "date": "2026-01-03",
            "count": 1
          },
          {
            "date": "2026-01-04",
            "count": 1
          },
          {
            "date": "2026-01-06",
            "count": 1
          },
          {
            "date": "2026-01-11",
            "count": 1
          },
          {
            "date": "2026-01-20",
            "count": 1
          },
          {
            "date": "2026-01-21",
            "count": 1
          },
          {
            "date": "2026-01-26",
            "count": 1
          },
          {
            "date": "2026-01-28",
            "count": 1
          },
          {
            "date": "2026-01-29",
            "count": 1
          },
          {
            "date": "2026-02-04",
            "count": 1
          },
          {
            "date": "2026-02-06",
            "count": 1
          },
          {
            "date": "2026-02-12",
            "count": 9
          },
          {
            "date": "2026-02-13",
            "count": 2
          },
          {
            "date": "2026-02-14",
            "count": 2
          },
          {
            "date": "2026-02-16",
            "count": 1
          },
          {
            "date": "2026-02-17",
            "count": 1
          },
          {
            "date": "2026-02-19",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-11",
            "count": 1
          },
          {
            "date": "2026-03-13",
            "count": 1
          },
          {
            "date": "2026-03-19",
            "count": 2
          },
          {
            "date": "2026-03-20",
            "count": 1
          },
          {
            "date": "2026-03-21",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 1
          },
          {
            "date": "2026-03-26",
            "count": 1
          },
          {
            "date": "2026-03-28",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-04-02",
            "count": 1
          },
          {
            "date": "2026-04-07",
            "count": 1
          },
          {
            "date": "2026-04-08",
            "count": 2
          },
          {
            "date": "2026-04-15",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 1
          },
          {
            "date": "2026-05-04",
            "count": 1
          },
          {
            "date": "2026-05-11",
            "count": 1
          },
          {
            "date": "2026-05-14",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-24",
            "count": 1
          },
          {
            "date": "2026-05-25",
            "count": 7
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-05-31",
            "count": 2
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-10",
            "count": 1
          },
          {
            "date": "2026-06-17",
            "count": 1
          },
          {
            "date": "2026-06-18",
            "count": 1
          },
          {
            "date": "2026-06-19",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-07-16",
            "count": 1
          },
          {
            "date": "2026-07-20",
            "count": 1
          }
        ],
        "complete": false,
        "collected": 1000,
        "total_stars": 3878
      },
      "open_issues_and_prs": 29
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 20293,
      "source_files_sampled": 49,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "Gemfile"
      ],
      "advisories": {
        "error": "No resolved dependencies carried a version and a supported ecosystem",
        "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": 11,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "rubygems"
      ],
      "dependencies": [
        {
          "name": "activerecord",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": "~> 7.2"
        },
        {
          "name": "mysql2",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "trilogy",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "pg",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": null
        },
        {
          "name": "sqlite3",
          "manifest": "Gemfile",
          "ecosystem": "rubygems",
          "version_constraint": "~> 1.6.9"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "activerecord",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "pg",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "sqlite3",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "trilogy",
            "direct": true,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "appraisal",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "logger",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "minitest",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "rake",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "simplecov",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "simplecov-json",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          },
          {
            "name": "yard",
            "direct": false,
            "version": null,
            "ecosystem": "rubygems"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 11,
        "direct_count": 4,
        "indirect_count": 7
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 7,
        "merged_prs": 323,
        "open_issues": 22,
        "closed_ratio": 0.936,
        "closed_issues": 323,
        "closed_unmerged_prs": 85
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "kbrock",
          "commits": 613,
          "avatar_url": "https://avatars.githubusercontent.com/u/1930?v=4"
        },
        {
          "type": "User",
          "login": "stefankroes",
          "commits": 55,
          "avatar_url": "https://avatars.githubusercontent.com/u/37841?v=4"
        },
        {
          "type": "User",
          "login": "d-m-u",
          "commits": 20,
          "avatar_url": "https://avatars.githubusercontent.com/u/16326669?v=4"
        },
        {
          "type": "User",
          "login": "vanderhoorn",
          "commits": 10,
          "avatar_url": "https://avatars.githubusercontent.com/u/32971?v=4"
        },
        {
          "type": "User",
          "login": "hw676018683",
          "commits": 9,
          "avatar_url": "https://avatars.githubusercontent.com/u/8272538?v=4"
        },
        {
          "type": "User",
          "login": "ledermann",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/3557?v=4"
        },
        {
          "type": "User",
          "login": "kshnurov",
          "commits": 7,
          "avatar_url": "https://avatars.githubusercontent.com/u/498185?v=4"
        },
        {
          "type": "User",
          "login": "brocktimus",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/2103728?v=4"
        },
        {
          "type": "User",
          "login": "gstokkink",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/14915325?v=4"
        },
        {
          "type": "User",
          "login": "Fryguy",
          "commits": 5,
          "avatar_url": "https://avatars.githubusercontent.com/u/52120?v=4"
        }
      ],
      "contributors_sampled": 99,
      "top_contributor_share": 0.708
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "run_test_suite.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [
        ".rubocop.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "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": 9,
            "reason": "12 out of 13 merged PRs checked by a CI test -- score normalized to 9",
            "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 1/12 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 13 contributing companies or organizations",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 9,
            "reason": "8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9",
            "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": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 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": "e8c09d27929a292452901c8b5f34b1b0a1b882b4",
        "ran_at": "2026-07-22T00:35:20Z",
        "aggregate_score": 5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-20T13:32:26Z",
      "oldest_open_prs": [
        {
          "number": 55,
          "created_at": "2011-06-03T04:59:38Z",
          "last_comment_at": "2011-11-16T19:13:43Z",
          "last_comment_author": "ckdake"
        },
        {
          "number": 481,
          "created_at": "2020-06-20T18:09:15Z",
          "last_comment_at": "2023-07-13T19:38:29Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 697,
          "created_at": "2025-04-15T16:01:30Z",
          "last_comment_at": "2026-03-19T20:18:40Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 698,
          "created_at": "2025-05-11T09:34:24Z",
          "last_comment_at": "2026-04-06T13:36:55Z",
          "last_comment_author": "a5-stable"
        },
        {
          "number": 747,
          "created_at": "2026-03-28T05:16:11Z",
          "last_comment_at": "2026-04-16T05:29:22Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 749,
          "created_at": "2026-03-30T20:20:19Z",
          "last_comment_at": "2026-04-01T01:57:41Z",
          "last_comment_author": "djberg96"
        },
        {
          "number": 761,
          "created_at": "2026-04-28T00:12:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-06-25T00:51:41Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 59,
          "created_at": "2011-06-24T21:15:26Z",
          "last_comment_at": "2022-12-06T15:53:59Z",
          "last_comment_author": "spacerobotTR"
        },
        {
          "number": 75,
          "created_at": "2011-09-14T03:51:51Z",
          "last_comment_at": "2019-05-21T20:33:05Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 80,
          "created_at": "2011-10-01T20:11:50Z",
          "last_comment_at": "2026-03-11T04:26:08Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 93,
          "created_at": "2012-06-04T15:21:36Z",
          "last_comment_at": "2022-08-19T05:16:00Z",
          "last_comment_author": "dastanabeuov"
        },
        {
          "number": 98,
          "created_at": "2012-08-14T12:17:17Z",
          "last_comment_at": "2022-02-02T14:01:51Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 127,
          "created_at": "2013-04-11T18:36:36Z",
          "last_comment_at": "2024-03-06T20:42:18Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 148,
          "created_at": "2013-08-21T12:46:16Z",
          "last_comment_at": "2024-03-06T20:47:38Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 171,
          "created_at": "2013-12-30T12:24:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 197,
          "created_at": "2014-07-30T19:58:57Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 209,
          "created_at": "2014-10-22T20:02:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 212,
          "created_at": "2014-11-06T04:38:38Z",
          "last_comment_at": "2016-01-26T10:17:09Z",
          "last_comment_author": "dpsk"
        },
        {
          "number": 213,
          "created_at": "2014-11-07T01:36:09Z",
          "last_comment_at": "2015-05-12T06:22:31Z",
          "last_comment_author": "stefankroes"
        },
        {
          "number": 318,
          "created_at": "2016-12-23T14:27:24Z",
          "last_comment_at": "2016-12-27T07:52:41Z",
          "last_comment_author": "solars"
        },
        {
          "number": 423,
          "created_at": "2018-11-27T14:13:25Z",
          "last_comment_at": "2019-01-03T12:29:51Z",
          "last_comment_author": "astyagun"
        },
        {
          "number": 433,
          "created_at": "2019-03-19T13:55:12Z",
          "last_comment_at": "2022-09-28T13:48:46Z",
          "last_comment_author": "donnguyen"
        },
        {
          "number": 440,
          "created_at": "2019-04-23T17:04:13Z",
          "last_comment_at": "2023-11-06T18:14:53Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 521,
          "created_at": "2020-12-09T16:03:42Z",
          "last_comment_at": "2020-12-10T10:28:32Z",
          "last_comment_author": "stevieing"
        },
        {
          "number": 584,
          "created_at": "2022-06-27T21:46:03Z",
          "last_comment_at": "2026-04-28T09:06:12Z",
          "last_comment_author": "Ancez"
        },
        {
          "number": 586,
          "created_at": "2022-07-12T02:53:43Z",
          "last_comment_at": "2026-04-02T21:51:31Z",
          "last_comment_author": "kbrock"
        },
        {
          "number": 695,
          "created_at": "2025-02-16T04:22:48Z",
          "last_comment_at": "2025-05-21T15:09:52Z",
          "last_comment_author": "a5-stable"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/stefankroes/ancestry",
    "host": "github.com",
    "name": "ancestry",
    "owner": "stefankroes"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 67,
      "inputs": {
        "security": 50,
        "vitality": 67,
        "community": 86,
        "governance": 62,
        "engineering": 69
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 67,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "commits_last_year": 145,
              "human_commit_share": 0.99,
              "days_since_last_push": 26,
              "active_weeks_last_year": 20
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 26 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 26
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "20/52 weeks with commits",
                "points": 13.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 20
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "145 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 145
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9",
                "points": 9,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "moderate",
            "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": 62,
            "inputs": {
              "releases_count": 28,
              "latest_release_tag": "v5.1.0",
              "releases_from_tags": true,
              "days_since_latest_release": 135,
              "mean_days_between_releases": 221.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "28 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 28
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 135 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 135
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~221.3 days",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 221.3
                    }
                  }
                ],
                "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": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 26,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 26 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 26
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "excellent",
        "name": "Community & Adoption",
        "value": 86,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "excellent",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "forks": 472,
              "stars": 3878,
              "watchers": 45,
              "growth_state": "organic",
              "growth_factor_pct": 100
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "3,878 stars",
                "points": 58.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 3878
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "472 forks",
                "points": 22.3,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 472
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "45 watchers",
                "points": 9.1,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 45
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": true,
              "has_pull_request_template": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "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": 13.5,
                "status": "met",
                "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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "excellent",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 98,
            "inputs": {
              "packages": [
                "ancestry"
              ],
              "dependents": null,
              "ecosystems": "rubygems",
              "total_downloads": 38034866,
              "monthly_downloads": null
            },
            "components": [
              {
                "key": "total_downloads",
                "name": "Total downloads",
                "detail": "38,034,866 downloads all-time across rubygems",
                "points": 78.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_total",
                    "params": {
                      "count": 38034866,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 62,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 39,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 99,
              "top_contributor_share": 0.708
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 71% of commits",
                "points": 6.6,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 71
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "99 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 99
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 13 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "merged_prs": 323,
              "open_issues": 22,
              "closed_issues": 323,
              "issue_closed_ratio": 0.936,
              "closed_unmerged_prs": 85
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "94% of issues closed",
                "points": 43.8,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 94
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "323/408 decided PRs merged",
                "points": 30.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 323,
                      "decided": 408
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/12 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "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": 48,
            "inputs": {
              "followers": 40,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "stefankroes",
              "public_repos": 3,
              "account_age_days": 6440
            },
            "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": "40 followers of stefankroes",
                "points": 11.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 40,
                      "login": "stefankroes"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~17 yr old",
                "points": 16.4,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 17
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "ancestry"
              ],
              "ecosystems": "rubygems",
              "any_deprecated": false,
              "min_days_since_publish": 135
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on rubygems",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "rubygems"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 135 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 135
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "38 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 38
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "moderate",
        "name": "Engineering Quality",
        "value": 69,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": ".rubocop.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "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": "12 out of 13 merged PRs checked by a CI test -- score normalized to 9",
                "points": 18,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 50,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "moderate",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 50,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 5
            },
            "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": "12 out of 13 merged PRs checked by a CI test -- score normalized to 9",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 1/12 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 13 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "8 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 9",
                "points": 6.8,
                "status": "partial",
                "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 is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "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": 14
            },
            "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": "at_risk",
        "name": "AI Readiness",
        "value": 48,
        "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.828,
              "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": "82 of 99 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 82,
                      "sampled": 99
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.34,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0.01
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": ".rubocop.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".rubocop.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "34 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 34,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "1 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Ruby",
              "largest_source_bytes": 20293,
              "source_files_sampled": 49,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Ruby without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Ruby"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/49 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 49,
                      "oversized": 0
                    }
                  }
                ],
                "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": [
    "No resolved dependencies carried a version and a supported ecosystem"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T00:35:47.856195Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/stefankroes/ancestry.svg",
  "full_name": "stefankroes/ancestry",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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