JSON-Rohbericht maschinenlesbar
{
"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"
}