公开记录
软件健康报告模式 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年10月在 GitHub 上查看 ↗

stefankroes/ancestry 的健康指数为 100 分中的 67 分,处于「中等」区间。 其得分最高的类别是Community & Adoption(86/100),最低的是AI Readiness(48/100)。 最近一次更新在 26 天前。 近期的大部分工作由 1 位贡献者完成。

67
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Stefan Kroes个人账户
40 关注者3 个公开仓库始于 2008年12月Booking Experts

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
RubyGemsancestry5.1.0-38135 天前

按类别列示的指标

活力

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

67中等 · 占总体的 22%
评分方式
28.8/36推送新近度 — 最近一次推送于 26 天前
13.8/36提交节奏 — 52 周中有 20 周有提交
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

发布纪律

62中等
评分方式
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

社区健康

72良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
13.5/13.5行为准则
0/7.2议题模板
6.3/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
78.8/80累计下载量 — rubygems 合计历史 38,034,866 次下载
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议题解决 — 94% 的议题已关闭
30.3/38.3PR 接受 — 已裁定的 PR 中 323/408 已合并
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
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
11.6/25所有者影响力 — stefankroes 有 40 位关注者
16.4/25既往记录 — 3 个公开仓库,账户约 17 年
所用输入
followers40
owner_typeUser
is_verified
owner_loginstefankroes
public_repos3
account_age_days6,440
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — rubygems 上有 1 个软件包
35/35发布时效 — 最近一次发布于 135 天前
20/20版本历史 — 38 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesancestry
ecosystemsrubygems
any_deprecated
min_days_since_publish135

工程质量

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

69中等 · 占总体的 20%

工程实践

82良好
评分方式
24/24CI 工作流 — 1 个工作流
24/24存在测试
16/16Linter 配置 — .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。 其余权重已重新归一化。

AI 就绪度

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

48存在风险 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 99 次人类提交中有 82 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.828
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
11/11Lint / 格式化配置 — .rubocop.yml
0/11静态类型检查
0/10可复现环境
10/10已体现的代理实践 — 最近 100 次提交中有 34 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 1 次为自动依赖更新
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可控的文件大小 — 采样的 49 个源文件中有 0 个超过 60KB
所用输入
primary_languageRuby
largest_source_bytes20,293
source_files_sampled49
oversized_source_files0

关键数据

3,878GitHub 星标
99贡献者
145最近 12 个月提交数
26距最近推送天数
28发布版本数
1巴士系数(bus factor)
22开放议题
RubyGems软件包生态系统数

数据采集警告

  • No resolved dependencies carried a version and a supported ecosystem

更多细节

Star 与 Fork 历史 3,878 ★ / 472 ⇿
3,878Star
472Fork
28发布

每颗 star 和每个 fork 的添加时间,来自 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 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
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.