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

czepluch / gleeth

Interact with Ethereum in Gleam

GleamMIT★ 0 зірок⑂ 0 форківз бер. 2026 р.Переглянути на GitHub ↗

czepluch/gleeth має індекс здоров’я 49 зі 100, що відповідає смузі «У зоні ризику». Найвищий показник — Sustainability & Governance (58/100), найнижчий — Community & Adoption (32/100). Останнє оновлення було 98 днів тому. Більшість нещодавньої роботи виконує один учасник.

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

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

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

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

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

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

Власність

jstczОсобистий обліковий запис
64 підписники65 публічних репозиторіївз вер. 2011 р.@phylaxsystems

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

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

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

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

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

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

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

Активність розробки

33У зоні ризику
Як обчислюється оцінка
9.9/36Свіжість push — останній push 98 дн. тому
5.5/36Ритм комітів — 8/52 тижнів із комітами
17.7/18Обсяг комітів — 92 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — 0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Використані вхідні дані
commits_last_year92
human_commit_share1
days_since_last_push98
active_weeks_last_year8
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 8 релізів
27/36Свіжість релізів — останній реліз 97 дн. тому
27/27Ритм релізів — реліз кожні ~4,9 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count8
latest_release_tagv1.7.0
releases_from_tagsні
days_since_latest_release97
mean_days_between_releases4,9
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

32У зоні ризику · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 0 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні
Як обчислюється оцінка
44.1/80Щомісячні завантаження — 2 038 завантажень/місяць у hex
0/20Залежні пакети в реєстрі — ця екосистема цього не повідомляє
Використані вхідні дані
packagesgleeth
dependents
ecosystemshex
total_downloads8 223
monthly_downloads2 038
Виключено з оцінювання (немає даних або не застосовно): Залежні пакети в реєстрі. Залишкові ваги перенормовано.

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

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

58Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
44.5/46.8Вирішення issue — закрито 95% issue
0/38.3Прийняття PR — немає вирішених pull request-ів або даних
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs0
open_issues2
closed_issues40
issue_closed_ratio0,952
closed_unmerged_prs0
Виключено з оцінювання (немає даних або не застосовно): Прийняття PR. Залишкові ваги перенормовано.
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
13/25Охоплення власника — 64 підписників у czepluch
25/25Послужний список — 65 публічних репозиторіїв, вік облікового запису ~14 р.
Використані вхідні дані
followers64
owner_typeUser
is_verified
owner_loginczepluch
public_repos65
account_age_days5 440
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

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

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у hex
35/35Свіжість публікацій — остання публікація 98 дн. тому
20/20Історія версій — 8 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgleeth
ecosystemshex
any_deprecatedні
min_days_since_publish98

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

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

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

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

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

Безпека

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

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

Стан безпеки

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

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

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

58Помірний · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — CLAUDE.md
0/15Машиночитана документація (llms.txt)
37.7/40Читабельна історія комітів — намір зазначено у 65 з 92 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,707
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes4 791
Як обчислюється оцінка
18/18Розгортання однією командою — mise.toml
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
0/11Статична перевірка типів
0/10Відтворюване середовище
0/10Підтверджена практика роботи з агентами — серед останніх 92 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfiles
has_dockerfileні
typed_languageні
bootstrap_filesmise.toml
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0
toolchain_manifests
dependency_bot_commit_share0
Як обчислюється оцінка
0/45Типізований код — Gleam без конфігурації перевірки типів
55/55Керовані розміри файлів — 0/2 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGleam
largest_source_bytes5 662
source_files_sampled2
oversized_source_files0

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

0зірок GitHub
1контриб'юторів
92комітів за останні 12 місяців
98днів від останнього пушу
8релізів
1бас-фактор
2відкритих issue
пакетних екосистем

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

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Докладніше

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

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
н/дCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
0Maintained0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
н/дPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Усі залежності не зібрано

Не вдалося зібрати розв'язаний набір залежностей для цього звіту: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 356,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Gleam": 608595,
        "Erlang": 1417,
        "JavaScript": 5953
      },
      "pushed_at": "2026-04-21T15:57:01Z",
      "created_at": "2026-03-11T22:23:55Z",
      "owner_type": "User",
      "updated_at": "2026-04-21T15:51:32Z",
      "description": "Interact with Ethereum in Gleam",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Gleam",
      "significant_languages": [
        "Gleam"
      ]
    },
    "owner": {
      "blog": null,
      "name": "jstcz",
      "type": "User",
      "login": "czepluch",
      "company": "@phylaxsystems ",
      "location": "Copenhagen, Denmark",
      "followers": 64,
      "avatar_url": "https://avatars.githubusercontent.com/u/1026799?v=4",
      "created_at": "2011-09-05T07:42:42Z",
      "is_verified": null,
      "public_repos": 65,
      "account_age_days": 5440
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2026-04-22T13:21:16Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-04-14T16:13:12Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-04-07T00:09:40Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-04-06T00:41:46Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-03-28T22:22:09Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-03-26T22:26:40Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-03-23T18:17:20Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-03-19T00:05:37Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "d4eef4da887e505042177158137efce6911579fc",
          "body": null,
          "is_bot": false,
          "headline": "Bump to v1.7.0",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-21T15:51:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "127cf578ab1531330d7b10582b935c1fa7a042d0",
          "body": "Critical fixes per Gleam conventions (libraries must never panic):\n- Remove all 26 `let assert Ok(...)` from library code, replaced with\n  proper Result handling via `use <- result.try` or case expressions\n- Remove all `Ok(\"\")` error swallowing, replaced with proper Error\n  propagation\n\nDRY improvem\n[…]\nents.gleam, remove duplicate\n  from event_watcher.gleam\n\nNon-idiomatic fixes:\n- Move imports from bottom to top in events.gleam and wei.gleam\n- Add Gleam conventions reference to CLAUDE.md\n\nCloses #42",
          "is_bot": false,
          "headline": "Refactor: eliminate panics, swallowed errors, and code duplication",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-20T15:58:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "93e4ab26d0b5d2ea91835c351143d61633c73e1d",
          "body": "ens.reverse_resolve queries the reverse registrar to map addresses\nback to their primary ENS name. Computes the reverse node\n(<addr>.addr.reverse), looks up the resolver, calls name(bytes32).\n\n3 new tests: reverse namehash computation, resolve vitalik's address\non mainnet, no-record address. README updated.\n\nCloses #41",
          "is_bot": false,
          "headline": "Add ENS reverse resolution (address to name)",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-20T14:29:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f52d9400d307f08f9eec7fce2d0b2f56d444aeaf",
          "body": "chain.by_id and chain.by_name look up pre-configured EVM networks.\nchain.to_provider creates a Provider with chain ID and retry enabled.\nchain.add extends the registry with custom chains.\n\nPre-configured: Ethereum, Sepolia, Arbitrum, Optimism, Polygon, Base.\nData verified against ethereum-lists/chains (the canonical source used\nby chainlist.org). Supports aliases: \"mainnet\", \"arbitrum\", \"op\", \"matic\".\n\n14 tests. Docs updated: README, CLAUDE.md.\n\nCloses #26",
          "is_bot": false,
          "headline": "Add multi-chain configuration registry",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-16T22:24:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccc57144073c512141c6325b654a70deea6becbe",
          "body": null,
          "is_bot": false,
          "headline": "Fix tutorial link to lowercase filename",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-15T23:11:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58f15c852144ab985f9f2f00358c7d1768984bf6",
          "body": null,
          "is_bot": false,
          "headline": "Remove PLAN.md from repo, rename tutorial to lowercase",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-15T23:10:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12fca9489e17edc4d200fb4ae89a1e92856886bb",
          "body": null,
          "is_bot": false,
          "headline": "Remove CHANGELOG.md - release notes are the canonical changelog",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-14T12:46:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2aaad236dd4f5d77d6fb45beb96db5a145d8a6de",
          "body": null,
          "is_bot": false,
          "headline": "Bump to v1.6.0 with changelog",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-14T12:24:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14db9255150d2ce418ab9c2c6fbd59fa3747216e",
          "body": null,
          "is_bot": false,
          "headline": "Fix ENS tests to not retry in CI - use no-retry provider",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-14T12:21:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e9c89259047062fe6df53fceccdb85e32f546822",
          "body": "ens.resolve(provider, \"vitalik.eth\") queries the ENS registry and\nresolver contracts to map names to addresses. ens.namehash implements\nthe recursive keccak256 namehash algorithm.\n\n6 tests: namehash for empty/eth/vitalik.eth/subdomain (offline),\nresolve vitalik.eth against mainnet, nonexistent name handling.\nDocs updated: README, CLAUDE.md, PLAN.md.\n\nCloses #24",
          "is_bot": false,
          "headline": "Add ENS name resolution",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-14T12:17:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f4b78234a02fac09b87478c7a654e1c12d5da8dd",
          "body": "…ness\n\nevent_watcher: spawns a block watcher internally, queries logs for each\nnew block, decodes against ABI, forwards typed ContractEvent messages.\nSupports filtering by event name. Architecture respects BEAM Subject\nownership: the spawned process creates the block events Subject it\nreceives from,\n[…]\ntion_test: replaced direct get_transaction_receipt calls with\nwait_for_receipt to fix flaky failures when anvil receipts aren't\nimmediately available.\n\n3 event watcher tests, docs updated.\n\nCloses #40",
          "is_bot": false,
          "headline": "Add real-time contract event streaming and fix integration test flaki…",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-09T22:25:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d5e6b1b53e780c8131cb2d7ebc260e1d5ed82ca7",
          "body": null,
          "is_bot": false,
          "headline": "Add event watcher issue (#40) and BEAM actor opportunities to plan",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-08T00:10:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5951f2567b2601da9518d9edd35ce54390e5134",
          "body": "watcher.start(provider) spawns a BEAM actor that polls eth_blockNumber\nand sends NewBlock events to a caller-owned Subject. Uses gleam_otp\nactor for proper lifecycle: Init message passes self-reference for\nsend_after scheduling, Stop message triggers graceful shutdown.\n\nEmits one event per block (ca\n[…]\nass between polls). Configurable poll interval via WatcherConfig.\n\n4 tests against anvil: detect new block, detect multiple blocks,\nstop, timeout. Docs updated: README, CLAUDE.md, PLAN.md.\n\nCloses #22",
          "is_bot": false,
          "headline": "Add block watcher using OTP actor pattern",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-07T23:32:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "804bd21b1cb2a58ea441e17fb4c33d74b724f410",
          "body": "… wei",
          "is_bot": false,
          "headline": "Add ERC-20 tutorial: balances, transfers, approve, events, multicall,…",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-07T12:44:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7333bb4b4303bc03f7af0f6a73617e408537f404",
          "body": null,
          "is_bot": false,
          "headline": "Show EIP-1559 as the default transaction example in README",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-07T11:51:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d05a3094975eec0590df5e8e876e091415d8c0e8",
          "body": null,
          "is_bot": false,
          "headline": "Bump to v1.5.0 with changelog",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T23:59:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a7ae6457ad1ddf8d589d3ab77852d759d71885c4",
          "body": "multicall.new() |> multicall.add(target, calldata) |> multicall.execute(provider)\nbatches contract reads into a single eth_call via the canonical Multicall3\ncontract (0xcA11bde05977b3631167028862bE2a173976CA11). Supports try_add\nfor calls allowed to fail without reverting the batch. execute_at for\ncustom Multicall3 addresses.\n\n4 tests against anvil: batch reads, mixed success/failure, empty batch,\nmultiple contracts. Docs updated: README, CLAUDE.md, PLAN.md.\n\nCloses #28",
          "is_bot": false,
          "headline": "Add Multicall3 batching for efficient contract reads",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T23:54:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b41cc77486e8d91ce6de65379f504a12f75b34d2",
          "body": null,
          "is_bot": false,
          "headline": "Update docs for events and permit modules",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T23:44:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d5a6525232534e63822aeaadd81c45d24f1c6161",
          "body": "permit.sign fetches token name, nonce, and chain ID via RPC, constructs\nthe EIP-712 Permit typed data, and signs it. Returns v, r, s ready for\non-chain submission. permit.sign_with_domain for explicit domain control.\n\n4 tests: sign with domain, determinism, different amounts diverge,\nsignature recovery roundtrip.\n\nCloses #38",
          "is_bot": false,
          "headline": "Add EIP-2612 permit signing helper",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T23:44:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58bc4aba34a98dbf1b4e6fc51a8fb462e70ed65c",
          "body": "events.get_events combines get_logs + ABI event matching into one call.\nevents.get_events_by_name filters by event topic0 at the RPC level.\nevents.decode_logs works on existing logs (e.g. from receipts).\nUnmatched logs returned as Unknown so no data is lost.\n\nCloses #39",
          "is_bot": false,
          "headline": "Add event streaming with automatic ABI decoding",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T23:42:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "315ca56cef87cf1dba13e77eb30594d6b29937dd",
          "body": "…ADME\n\n- contract.gleam: examples on at, call, send, call_raw, send_raw plus\n  module doc showing both typed and string-coerced patterns\n- gas.gleam: examples on estimate_legacy and estimate_eip1559\n- nonce.gleam: examples on new, next, reset\n- README: new \"Contract interaction\" section showing call_raw/send_raw",
          "is_bot": false,
          "headline": "Add comprehensive doc examples to contract, gas, nonce modules and RE…",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T23:31:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5366e74f45cb6d7e50f763d5d6b67fda3678fe04",
          "body": "contract.call_raw and contract.send_raw accept List(String) instead of\nList(AbiValue). Arguments are auto-coerced to the correct ABI types\nbased on the function's ABI definition: addresses as hex strings,\nintegers as decimal or hex, booleans as true/false.\n\nThis is the runtime wrapper approach for #\n[…]\n no code generation\nneeded. Users pass plain strings, the ABI handles type resolution.\n\n3 new tests: call_raw, send_raw then call_raw, wrong arg count error.\nDocs updated: README, PLAN.md.\n\nCloses #19",
          "is_bot": false,
          "headline": "Add string-coerced contract calls (call_raw/send_raw)",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T23:20:35Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c897f245a0357e4f05913aa6a2c530968b970df0",
          "body": null,
          "is_bot": false,
          "headline": "Update docs for Contract type and block queries",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T23:09:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee1febd2b929c03f4af1be31b70bac42c5c06856",
          "body": "contract.at(provider, address, abi) binds all three together.\ncontract.call for read-only calls with automatic ABI encoding/decoding.\ncontract.send for write transactions with automatic signing and broadcasting.\n\n5 tests against anvil: read call, write-then-read, unknown function error,\nrevert error, multiple calls on same instance.\n\nCloses #37",
          "is_bot": false,
          "headline": "Add Contract type for high-level contract interaction",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T23:05:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "602c29ddab72f2f353911cd91b2316352f892fcf",
          "body": "…e ideas to plan",
          "is_bot": false,
          "headline": "Add Contract type, permit helper, log streaming issues and speculativ…",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T22:37:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7bac45d64b5c0e4a23e7f0b39a60f0a5d6ca1d31",
          "body": null,
          "is_bot": false,
          "headline": "Bump to v1.4.0 with changelog",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T00:40:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "216905516d363757a546baba92ffff07b302cdf7",
          "body": "Two new RPC methods returning the Block type with transaction hashes.\nAdds EthGetBlockByHash method variant and block_decoder. Accepts hex\nblock numbers or tags (latest, earliest, pending).",
          "is_bot": false,
          "headline": "Add get_block_by_number and get_block_by_hash",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T00:39:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "324a788fb16f44e8247953d21bfef35bea54de5c",
          "body": "- eip712.gleam: add /// docs to all value constructors and domain setters\n- README: add EIP-712, batch RPC, contract deployment, retry middleware\n  to features list\n- CLAUDE.md: add eip712, deploy, batch modules to architecture\n- PLAN.md: mark #20, #21, #27, #29 as done, add new features to\n  \"What works\" section",
          "is_bot": false,
          "headline": "Add missing doc comments and update docs for new features",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T00:27:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9b8552294f1339137b90240c92330e5cb30b9759",
          "body": "RetryConfig on Provider: max_retries, initial_backoff_ms, max_backoff_ms.\nRetries on HTTP 429 (rate limited), 503 (service unavailable), and\nconnection failures. Exponential backoff doubles each attempt up to\nthe configured ceiling.\n\n- provider.default_retry(): 3 retries, 1s-8s backoff\n- provider.no_retry(): fail immediately (default for new())\n- mainnet() and sepolia() come with retries enabled\n- All RPC methods route through retry-aware response_utils\n\nCloses #29",
          "is_bot": false,
          "headline": "Add retry middleware with exponential backoff for transient RPC errors",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T00:12:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8eb3787d258c04a3db8c899f2506cc3a0c09fefd",
          "body": "deploy.deploy for contracts without constructor args.\ndeploy.deploy_with_args for contracts with ABI-encoded constructor\narguments. Both handle nonce/gas fetching, signing, broadcasting,\nand receipt polling internally, returning the contract address.\n\n3 tests against anvil: deploy Counter, deploy and call, deploy\nTestToken with constructor arg.\n\nCloses #27",
          "is_bot": false,
          "headline": "Add contract deployment helpers",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-06T00:00:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "787f5763a1be430195d4b86b2b292886b97579e9",
          "body": "batch.new() |> batch.add(method, params) |> batch.execute_strings(provider)\nsends all requests as a JSON array per the JSON-RPC batch spec.\nResponses matched to requests by ID, order preserved.\n\n- execute_strings: decode each response as a string (common case)\n- execute_raw: return full JSON response bodies for custom decoding\n- Individual errors don't break the batch\n- 6 tests against anvil\n\nCloses #21",
          "is_bot": false,
          "headline": "Add batch JSON-RPC for multiple requests in a single HTTP call",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-05T23:53:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78de19c5fab7abe53ae5697f6537468617d45686",
          "body": "6 new tests comparing gleeth output against hashes computed by a\ndeployed Solidity contract using abi.encode + keccak256:\n- Mail domain separator, struct hash, and full digest\n- ERC-2612 Permit domain separator, struct hash, and full digest\n\nAll hashes match byte-for-byte, confirming encodeType, encodeData,\nhashStruct, domainSeparator, and the \\x19\\x01 prefix composition\nare correct.",
          "is_bot": false,
          "headline": "Cross-verify EIP-712 hashes against Solidity reference contract",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-04-05T15:44:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a382e04ba3a659bab48974cf9ee5874d3c15e4b",
          "body": null,
          "is_bot": false,
          "headline": "Add cast-verified type hash assertions to EIP-712 tests",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-28T23:53:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "911bcf9b8598d975c29f3ac1e3e9f99d0696ffe9",
          "body": "Implements the full EIP-712 specification:\n- encodeType with recursive referenced type collection and sorting\n- encodeData for all atomic types (address, uint, int, bool, bytesN),\n  dynamic types (string, bytes), arrays, and nested structs\n- hashStruct and hashType\n- Domain separator with optional f\n[…]\nlder API for domain and typed data construction\n\n12 tests: encodeType, domain hashing, sign/recover roundtrips,\nnested structs, ERC-2612 permit example, integer/bool encoding,\ndeterminism.\n\nCloses #20",
          "is_bot": false,
          "headline": "Add EIP-712 typed structured data hashing and signing",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-28T23:32:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "03567b338b945664958688bb24c046652a82d5ef",
          "body": null,
          "is_bot": false,
          "headline": "Bump to v1.3.0 - library-only package, CLI split to gleeth-cli",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-28T22:13:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f145cf486a167cd39824c09e2e3cf82db044f534",
          "body": "Delete entrypoint, CLI arg parsing, all command modules, formatting\nutilities, and file I/O. Remove argv and simplifile dependencies.\ngleeth is now a pure library package.\n\nThe CLI will be re-created as a separate gleeth_cli package.\n\nBREAKING: gleam run no longer works. Use gleeth as a library dependency.\n\nCloses #18",
          "is_bot": false,
          "headline": "Remove CLI from gleeth - library-only package",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-28T21:27:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95671b8db2c9a6935a966bfced9d8a8cd67c98e0",
          "body": "Full ERC-20 flow against anvil: deploy test token with forge, verify\ninitial balanceOf, approve spender, execute transferFrom, verify\nTransfer event log, verify final balanceOf. Tests gleeth's ABI\nencoding for contract calls and response decoding end-to-end.\n\nCloses #8",
          "is_bot": false,
          "headline": "Add ERC-20 integration test: deploy, approve, transferFrom, balanceOf",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-28T20:50:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83ce05568f1501c9cb45815b26dbc34fc0d8e593",
          "body": "ABI fuzz: random roundtrips for uint256, int256, bool, address,\nstring, bytes, bytes32, tuples, and dynamic arrays using qcheck.\nSign/recover fuzz: random key generation, hash signing, personal\nmessage signing, and wrong-message rejection verification.\n\nCloses #7",
          "is_bot": false,
          "headline": "Add ABI encode/decode fuzz tests and sign/recover cycles",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-27T13:43:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e67a57b23b84c7a14622eb364a3b8536d8f40056",
          "body": null,
          "is_bot": false,
          "headline": "Bump to v1.2.0 with changelog",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-26T19:47:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d5f7c358d0921864cc4cee4fa531d1ac9f65dc2",
          "body": "- PLAN.md: remove test counts, mark phases 6 and 8 as done, remove\n  duplicated phase descriptions for completed work\n- CLAUDE.md: update architecture to reflect current modules (provider,\n  wei, gas, nonce, address, transaction builder/decoder), fix stale\n  config.new reference, add missing error variants",
          "is_bot": false,
          "headline": "Remove hardcoded counts and stale content from docs",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-25T16:17:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e06e69a26ecbb82ff43fc0d675f420fc6450c4be",
          "body": null,
          "is_bot": false,
          "headline": "Remove test count from README - unnecessary maintenance burden",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-25T15:02:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e047108f6a7d44384aa7ab3e4ae01ba331a4bc9",
          "body": "Add builder API quick start showing pipeline-style transaction\nconstruction with human-readable values. Update features list to\ninclude all v1.1.0+ additions: transaction decoder, gas estimation,\nreceipt polling, nonce manager, wei conversions, EIP-55, EIP-191.",
          "is_bot": false,
          "headline": "Update README with builder pipeline example and full feature list",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-25T15:00:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7bf2c0951ff02821699a3b3dba54ac75d7154cc",
          "body": "Takes a parsed ABI FunctionEntry and result hex, extracts output\ntypes, and decodes. Matches the convenience of encode_call.\n\nCloses #36",
          "is_bot": false,
          "headline": "Add decode_outputs for ABI function entry return values",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-25T14:47:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90145f7b4758beddb3e8eff7569359b0afc2d042",
          "body": "Builder: pipeline-style API with LegacyBuilder/Eip1559Builder types.\nSetters accept human-readable values (value_ether, gas_price_gwei)\nor raw hex. sign_legacy/sign_eip1559 validate and sign in one step.\n\nSender recovery: recover_sender and recover_sender_eip1559 reconstruct\nthe signing hash and recover the signer address via ecrecover.\n\nCloses #15\nCloses #34",
          "is_bot": false,
          "headline": "Add transaction builder API and sender recovery",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-25T14:45:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f83992f273872cfcce4ced39d68dd57638bbbfd",
          "body": "NonceManager fetches initial nonce from network, then increments\nlocally for subsequent calls. reset re-syncs with network state.\n\nCloses #16",
          "is_bot": false,
          "headline": "Add local nonce manager for multi-transaction sequences",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-25T14:44:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "607c070b9cd22cc4b7a46c46191dfe6b3f8596db",
          "body": "estimate_legacy returns gas_price + gas_limit in one call.\nestimate_eip1559 returns max_fee (2 * base_fee + priority_fee),\npriority_fee, and gas_limit. Eliminates 10-15 lines of boilerplate\nper transaction.\n\nCloses #14",
          "is_bot": false,
          "headline": "Add gas estimation helpers for legacy and EIP-1559",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-25T14:44:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51e7c7787c8238a4e90683d5b73162be543d028b",
          "body": "wait_for_receipt polls get_transaction_receipt with backoff (1s, 2s,\n4s, 4s...) and 60s default timeout. wait_for_receipt_with_timeout\naccepts custom timeout in milliseconds.\n\nCloses #13",
          "is_bot": false,
          "headline": "Add receipt polling with exponential backoff",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-25T14:43:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4bd9320258b95d02c344eb32290b684ae3edda09",
          "body": "Closes #5",
          "is_bot": false,
          "headline": "Update actions/checkout to v6 for Node.js 24 compatibility",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-23T20:10:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5e4f973fa97b5f3e97b3ae18e567297f08bf847",
          "body": "MockWallet type and hardcoded mock functions were not testing real\nwallet integration. Replaced with actual crypto/wallet calls.\n\nCloses #4",
          "is_bot": false,
          "headline": "Replace mock wallet with real wallet module in random_test",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-23T20:09:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca54d4f78b1ad0f7c992030c264c3462ef35422e",
          "body": "Both are handled in main() before execute_command is called.\nCombined into a single pattern with a comment.\n\nCloses #2",
          "is_bot": false,
          "headline": "Collapse unreachable Wallet/Help cases in execute_command",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-23T20:09:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6eefe49adad15bb5e7f6c20686ad085d77b4afa7",
          "body": "ParamType, Parameter, and ContractCall types were wrappers around the\nABI type system that predated it. Refactored all functions to use\nAbiType/AbiValue directly. Updated call command and tests.\n\nCloses #1",
          "is_bot": false,
          "headline": "Remove legacy ParamType shim from contract.gleam",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-23T20:09:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "aa7b1509a841213d450d9b8b73dd3090b0419040",
          "body": null,
          "is_bot": false,
          "headline": "Update PLAN.md to reflect v1.1.0 state and reorganize phases",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-23T19:50:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "919deadb36f7b135f135a135e5394f16a3526a13",
          "body": null,
          "is_bot": false,
          "headline": "Bump to v1.1.0 with changelog and move qcheck to dev-dependencies",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-23T17:59:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9429cd6128db53cff8f16a34eab0f85ef6f48370",
          "body": "wei.from_ether, wei.from_gwei convert human-readable amounts to hex.\nwei.to_ether, wei.to_gwei convert hex back to decimal strings.\nwei.from_int, wei.to_int for integer/hex conversion. Uses bigi for\narbitrary precision - no float truncation on large values.\n26 tests including roundtrips and edge cases.\n\nCloses #11",
          "is_bot": false,
          "headline": "Add wei/gwei/ether conversion module",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-23T17:39:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac0f81baedf1d286f119cedbe5bc1002f5c80a78",
          "body": "address.checksum produces mixed-case checksummed addresses per EIP-55.\naddress.is_valid_checksum validates checksums, accepting all-lowercase\nand all-uppercase as always valid. 15 tests including EIP-55 spec vectors\nand known anvil addresses.\n\nCloses #12",
          "is_bot": false,
          "headline": "Add EIP-55 checksummed addresses",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-23T17:39:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "431cc670b247b576cf26e7251f8b26b0f125ea43",
          "body": "19 tests covering malformed JSON, RPC errors, null/missing fields,\ntype mismatches, and edge cases in transaction/receipt/fee decoding:\n- Empty, invalid, truncated JSON returns clean errors\n- RPC error responses detected and propagated\n- Null optional fields (pending tx, contract creation, receipts)\n- EIP-1559 tx fields (missing gasPrice, present maxFeePerGas)\n- Fee history without optional reward field\n- Type mismatches (number/object where string expected)\n\nCloses #9",
          "is_bot": false,
          "headline": "Add RPC response edge case tests for decoder robustness",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-23T15:48:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e955dd33106222d1741c175d15e8efa57718fff",
          "body": "Tests against anvil (skipped gracefully if not running):\n- Deploy Counter contract and verify receipt has contract address\n- Deploy, call getCount(), increment(), call again, verify state change\n- Insufficient gas (gas limit 1) returns error\n- Insufficient balance returns error\n- Contract revert (fa\n[…]\nns error on eth_call\n- Nonce too low (replay) returns error\n- Multi-transaction sequence: 3 txs with sequential nonces, all mined\n- EIP-1559 contract deployment and interaction\n\nPartially addresses #8",
          "is_bot": false,
          "headline": "Add integration tests for contract deployment, errors, and multi-tx",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-22T23:15:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bb949ccc113a4158d39bc2488c1875d5eec53e05",
          "body": null,
          "is_bot": false,
          "headline": "Fix formatting in transaction_cast_test.gleam",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-22T20:50:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d03518281094532654c67f14064ff8a5036980d",
          "body": "Property-based fuzz tests (qcheck):\n- Legacy sign/decode roundtrip with random params (100 iterations)\n- EIP-1559 sign/decode roundtrip with random params (100 iterations)\n- Contract creation roundtrip, auto-detect, chain_id recovery\n- 8 fuzz functions exercising ~800 random transactions\n\nCross-impl\n[…]\n-1559 parameter sets verified byte-identical to cast mktx\n- Covers mainnet, Sepolia, Arbitrum, Polygon, Optimism\n- Tests zero value, high nonce, high gas, edge fee combinations\n\nPartially addresses #7",
          "is_bot": false,
          "headline": "Add fuzz testing and cross-implementation verification with cast",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-22T20:10:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4ee551c01d90f56683a9c6be662c6166d0074fab",
          "body": "- wallet.recover_personal_message: recover signer from personal_sign\n- wallet.verify_personal_message: verify signature against address\n- secp256k1.signature_from_hex: parse 65-byte hex signatures\n- Handles v=0/1 and v=27/28 normalization\n- 8 tests: sign/recover roundtrips, empty/long messages, wrong address,\n  signature parsing roundtrip, error cases\n\nCloses #32\nCloses #35",
          "is_bot": false,
          "headline": "Add EIP-191 personal message recovery and signature_from_hex",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-20T12:30:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56a70500460a2f45e0b01f60e4a7570e3e7753dc",
          "body": "…coding\n\n- decode_function_input: decode calldata given a function signature string\n- decode_calldata: decode calldata by matching selector against ABI entries\n- decode_function_output: decode eth_call return values\n- decode_revert: decode Error(string), Panic(uint256), and custom errors\n- 19 tests covering ERC-20 ops, multi-param, no-param, error cases,\n  roundtrips, and all revert types\n\nCloses #31\nCloses #33",
          "is_bot": false,
          "headline": "Add calldata decoding, function output decoding, and revert reason de…",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-20T12:30:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "31b37c1454f69e65265e529bee53ca85f0beaa4f",
          "body": "Implements decode_legacy, decode_eip1559, and auto-detecting decode\nfunction. Recovers chain_id from EIP-155 v values, parses access lists,\nand handles all edge cases (contract creation, zero values, large\nchain IDs). Includes 22 round-trip tests verifying decode against\nevery existing signing vector.\n\nCloses #30",
          "is_bot": false,
          "headline": "Add transaction decoder for legacy and EIP-1559 transactions",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-20T11:58:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9621d5a93850516dbe4066e5d4be8b9784608680",
          "body": "Covers zero value, contract creation (empty to), large chain IDs\n(Arbitrum 42161, max uint32 2^32-1), zero priority fee, multi-entry\naccess lists, and v-value correctness. All vectors generated with\ncast mktx and cross-verified with cast keccak for tx hashes.\n\nCloses #6",
          "is_bot": false,
          "headline": "Add 18 edge case signing tests verified against Foundry cast",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-19T23:12:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "220e9ef5c43b3d9fa22c1512a69b9486f71bf157",
          "body": "Add Phase 6 (code cleanup), reorganize phases 7-10 to cover\nergonomics, testing, and advanced features. New items include\ntyped contract bindings, EIP-712, batch JSON-RPC, nonce manager,\ngas estimation helpers, receipt polling, and block subscriptions.",
          "is_bot": false,
          "headline": "Expand PLAN.md with full roadmap through Phase 10",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-19T00:11:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "34944d657a2a42c538ff59d915195347fbce3450",
          "body": "Add prominent warning to README and provider module docs that gleeth\nhas not been audited and is recommended for testnet/development only.\nAdd Phase 8 (comprehensive testing) to PLAN.md for pre-audit work.",
          "is_bot": false,
          "headline": "Bump to v1.0.0 with unaudited warning for initial Hex release",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-19T00:00:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "135e2e4f63f7c8ab1c4a07527ee8a6845f91c502",
          "body": "- Add MIT LICENSE file and update gleam.toml licence field\n- Extract shared error_to_string onto GleethError, removing duplication\n  between gleeth.gleam and parallel_balance.gleam\n- DRY up wei/gwei string division into single parameterized helper\n- Remove vacuous tests that always passed (285 tests remain, all real)\n- Replace reimplemented list helpers in random_test with stdlib imports\n- Delete stale npm artifacts (node_modules, package.json)\n- Add CHANGELOG.md for v0.1.0",
          "is_bot": false,
          "headline": "Clean up for v0.1.0 release: DRY code, MIT license, changelog",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-18T23:37:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "701c363d36215d5c46192cd3790e474d54b5fc2d",
          "body": "All numeric parameters (value, gas, nonce) require 0x-prefixed hex\nstrings. Add per-parameter docs to create_legacy_transaction,\ncreate_eip1559_transaction, create_eth_transfer, create_contract_call.\nClarify in README that RPC return values can be passed directly.\nAdd Phase 7 to PLAN.md with future ergonomics work: wei conversion\nhelpers, EIP-55 checksums, type-safe builder pattern.",
          "is_bot": false,
          "headline": "Document hex string convention for transaction builders",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-18T22:27:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d03294af027cab2dcec8c72993f10ef11a767ee6",
          "body": "Add /// doc comments with ## Examples sections to all user-facing\nmodules: provider, rpc/methods, rpc/types, ethereum/types,\nethereum/abi/types. Add //// module docs to each. Replace placeholder\nREADME with quick start examples covering balance checks, transaction\nsigning, contract calls, and ABI encoding.",
          "is_bot": false,
          "headline": "Add comprehensive doc comments and README for v0.1.0",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-18T22:19:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05d3893588ec566846d9a9cdb1ab9b70a95ed356",
          "body": "Add WalletErr(WalletError), TransactionErr(TransactionError), and\nAbiErr(AbiError) variants to GleethError so library consumers can\nhandle one Result type across wallet, transaction, and RPC pipelines\nwithout losing semantic detail. Replaces string-flattening at bridge\npoints in send.gleam and contract.gleam.",
          "is_bot": false,
          "headline": "Consolidate error types with wrapper variants on GleethError",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-18T21:50:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d53c0691da8c41694e82e1a5c529bb801c7ee3f0",
          "body": "Delete wallet.sign_transaction and TransactionParams - stale\nplaceholder from before RLP/signing was implemented. Real signing\nlives in crypto/transaction. Set gleam.toml to 0.1.0 with\ndescription, licence, and repository for Hex publishing.",
          "is_bot": false,
          "headline": "Remove dead sign_transaction stub, set v0.1.0 publishing metadata",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-18T21:31:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54e09c5b65f3afc3660e2f09f562ae0abdac29d3",
          "body": "Replace bare rpc_url: String parameter threading with an opaque\nProvider type that carries validated URL and optional chain_id.\nProvider boundary is at methods.gleam - layers below unchanged.\nDeletes config.gleam (absorbed into provider.gleam).",
          "is_bot": false,
          "headline": "Add opaque Provider type, replace rpc_url string threading",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-18T17:00:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7e5bd85a3913aa5fb4d951072666b9f695280d5",
          "body": null,
          "is_bot": false,
          "headline": "Mark Phase 1 as done, update test count and CI status in plan",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-18T00:04:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b945aceb0eb8f3f8885f0e576fb48f6248716e86",
          "body": "Implements complete Solidity ABI support: type system, type string\nparser, encoder with head/tail layout, decoder, JSON ABI file parsing,\nevent log decoding, and CLI integration via --abi flag on call command.\nRefactors contract.gleam to delegate to the new ABI encoder. 292 tests\npass including roundtrip coverage for nested compound types.",
          "is_bot": false,
          "headline": "Add full ABI encoding/decoding system (all Solidity types)",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-17T23:51:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "050a240764f1f41d68b98d7958d01fdbe0351685",
          "body": "Receipt fetch after broadcast can fail if the transaction hasn't been\nmined yet. Print a helpful message instead of crashing, since the\nbroadcast itself already succeeded.",
          "is_bot": false,
          "headline": "Handle unavailable receipt gracefully in send command",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-16T14:55:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56d025877a37a36ad618740fd99078ebc8540033",
          "body": "New RPC methods: eth_sendRawTransaction, eth_getTransactionCount,\neth_gasPrice, eth_maxPriorityFeePerGas, eth_feeHistory, eth_chainId.\nAdd FeeHistory type for fee estimation responses.\n\nAdd `gleeth send` CLI command that queries nonce/fees from the node,\nsigns (EIP-1559 by default, --legacy for Type 0), broadcasts, and\nprints the receipt. Verified end-to-end against anvil.\n\nIntegration tests cover legacy broadcast, EIP-1559 broadcast, and\nfee history queries. Phase 3 complete.",
          "is_bot": false,
          "headline": "Add transaction broadcasting support and send CLI command",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-16T12:46:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2dae2f650fcfac00732a4f13fb138fe6513f98e4",
          "body": "Implement the modern Ethereum transaction format with envelope encoding\n(0x02 prefix), dual gas fields, simplified v recovery, and access list\nsupport. Verified byte-identical to Foundry cast mktx across 4 vectors\nincluding access list encoding. Update PLAN.md to reflect current state.",
          "is_bot": false,
          "headline": "Add EIP-1559 (Type 2) transaction signing",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-16T12:09:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b38b510762e7e52530be6fe2b4bc6ba5ea4bfa4",
          "body": "Three test vectors generated with cast mktx --legacy, covering:\n- Simple ETH transfer on mainnet (nonce 0, 1 gwei, 1 ETH)\n- ETH transfer on Sepolia (nonce 42, 20 gwei, 0.5 ETH, large chain ID)\n- Contract call with ABI-encoded calldata (transfer ERC-20)\n\nEach vector verifies raw_transaction, v/r/s components, and tx hash\nagainst Foundry's output. Integration test sends a Gleeth-signed tx\nto anvil and confirms it is accepted and mined (skips if anvil is\nnot running).",
          "is_bot": false,
          "headline": "Add transaction signing tests with Foundry-verified vectors",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-15T14:16:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "286f684022ef6e40780d0b7c2f8b0d2cbe8a2eea",
          "body": "Replace placeholder string concatenation with proper RLP encoding\nfor both the EIP-155 signing hash and raw transaction output. Fix\nthe v calculation bug (was double-counting recovery_id + 27). Hash\nthe actual transaction bytes in get_transaction_hash. Remove the\nnow-unnecessary RlpEncodingNotImplemented error variant.",
          "is_bot": false,
          "headline": "Wire RLP encoding into transaction signing",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-15T13:23:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b73df1da426fbb67ca254ddaa2b40f41deb04d2b",
          "body": "Implements the RLP serialization format needed for transaction signing\nand broadcasting. Includes encoder, decoder, and convenience helpers\nfor integer, string, and hex field conversion. 47 tests cover all\nencoding rules, boundary cases, roundtrips, and error handling.",
          "is_bot": false,
          "headline": "Add RLP encoding/decoding per Ethereum Yellow Paper spec",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-15T13:16:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f83eefbf0ce89cfe0a1070b30be3e8c1a0b9e4fb",
          "body": null,
          "is_bot": false,
          "headline": "Fix formatting in rpc_methods_test.gleam",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-15T12:48:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ed2d73a0547c6b7077f3906281df0e9c8dcfdf2b",
          "body": "Replace PROJECT_STATUS.md and PHASE_1_2_1_SUMMARY.md with a single\nPLAN.md covering the roadmap from RLP encoding through provider\nabstraction. Fix CI workflow: Gleam 1.14.0, OTP 28, add Elixir 1.19\nand mix local.hex step for NIF compilation. Update CLAUDE.md with\nbuild prerequisites and current FFI documentation.",
          "is_bot": false,
          "headline": "Consolidate project docs, fix CI workflow, add development plan",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-15T12:46:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0a5d3f6698362c8d33b83642e7de2c6faa9e4d61",
          "body": "Add 16 new tests for the JSON-RPC decoding layer covering:\n- String result decoding (block number, balance, code)\n- RPC error responses and malformed JSON\n- Transaction decoding (legacy, EIP-1559, pending, null)\n- Transaction receipt decoding (success, failed, contract creation)\n- Log decoding (with topics, empty list, multiple logs)\n\nAlso replace list.length(x) > 0 with x != [] in secp256k1_test.",
          "is_bot": false,
          "headline": "Add RPC decoder tests and fix list.length warning",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-15T12:19:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6af4a762ac283f22125eeafbcad8c4cd5eb0ccc1",
          "body": "recovery_demo_cli.gleam and signature_tool.gleam were standalone\nentry points for demonstrating signature recovery. Their\nfunctionality is covered by the wallet CLI subcommand and the\ncrypto test suite.",
          "is_bot": false,
          "headline": "Remove standalone demo scripts",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-15T12:11:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d43d2e31c9a509a077cd6f2ca7cbea488ae0288e",
          "body": "wallet.gleam was calling ExKeccak FFI directly for personal message\nhashing. Now routes through crypto/keccak.keccak256_binary instead.\nAlso simplified keccak.gleam by removing unnecessary bit_array\nroundtrip. Added mise.toml to pin Elixir toolchain requirement.",
          "is_bot": false,
          "headline": "Consolidate keccak256 calls through crypto/keccak module",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-15T12:10:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b94f4de40a1c55f13f891842f77cb6f72f500ddf",
          "body": "Replace sequential list.map with process.spawn + Subject for real\nconcurrent RPC calls, batched in groups of 10 with 30s timeout.\nAdded gleam_erlang as direct dependency for process module access.",
          "is_bot": false,
          "headline": "Make parallel_balance use actual concurrency",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-15T12:09:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ecc3dded789f18987e0a8f632ceb84e798ecd41",
          "body": "The get_env_rpc_url() function in cli.gleam was stubbed out and\nalways returned Error. Added get_env/1 to gleeth_ffi.erl wrapping\nErlang os:getenv, so the --rpc-url flag can now be omitted when\nthe env var is set.",
          "is_bot": false,
          "headline": "Implement GLEETH_RPC_URL environment variable support",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-15T12:09:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "81f32ba5a4bbbda6336a0279efece844d189b4c7",
          "body": "rpc/client.gleam now returns raw HTTP response body instead of\nhand-parsed JSON. rpc/methods.gleam uses typed decode.Decoder\ndefinitions for Transaction, TransactionReceipt, Log, and\nTransactionStatus. Removes ~900 lines of brittle string-based\nJSON extraction code (extract_json_field_value, extract_string_field,\nsplit_objects_recursive, etc.) in favor of ~80 lines of composable\ndecoders. Also adds CLAUDE.md for project context.",
          "is_bot": false,
          "headline": "Replace manual JSON parsing with gleam_json decoders",
          "author_name": "jstcz",
          "author_login": "czepluch",
          "committed_at": "2026-03-15T11:58:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4ebd995a8339bb50e5d1491a857d30322620fc4f",
          "body": null,
          "is_bot": false,
          "headline": "get history",
          "author_name": "Jacob Stenum Czepluch",
          "author_login": "czepluch",
          "committed_at": "2026-03-12T17:17:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87cb80fe97c49f18c77a954fa970b0d33d025907",
          "body": null,
          "is_bot": false,
          "headline": "save current status",
          "author_name": "Jacob Stenum Czepluch",
          "author_login": "czepluch",
          "committed_at": "2026-03-12T17:15:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8138f4e3edc618afa99acecc06bf0db485841417",
          "body": null,
          "is_bot": false,
          "headline": "add back some logic tests",
          "author_name": "Jacob Stenum Czepluch",
          "author_login": "czepluch",
          "committed_at": "2025-08-20T18:08:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "70530e4ea35bbeb49fc651183210641db304616e",
          "body": "- Reduce test count from 269 to 33 (88% reduction) while maintaining essential coverage\n- Add comprehensive .gitignore with Node.js, Gleam, and development file exclusions\n- Add JavaScript compatibility with package.json for cross-platform crypto\n- Eliminate all test console output and fix failing tests\n- Add critical cryptographic sign-and-verify test cycle\n- Update PROJECT_STATUS.md with current state and next steps\n\nAll tests passing, ready for next development phase.",
          "is_bot": false,
          "headline": "Major test suite cleanup and infrastructure improvements",
          "author_name": "Jacob Stenum Czepluch",
          "author_login": "czepluch",
          "committed_at": "2025-08-20T18:02:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbbabf8e333ac839a57bf63e864b314bfb80acb5",
          "body": null,
          "is_bot": false,
          "headline": "initial commit",
          "author_name": "Jacob Stenum Czepluch",
          "author_login": "czepluch",
          "committed_at": "2025-08-14T14:46:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 8,
      "commits_last_year": 92,
      "latest_release_at": "2026-04-22T13:21:16Z",
      "latest_release_tag": "v1.7.0",
      "releases_from_tags": false,
      "days_since_last_push": 98,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 97,
      "mean_days_between_releases": 4.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "gleeth",
          "exists": true,
          "license": "MIT",
          "keywords": [],
          "ecosystem": "hex",
          "matches_repo": true,
          "registry_url": "https://hex.pm/packages/gleeth",
          "is_deprecated": false,
          "latest_version": "1.7.0",
          "repository_url": "https://github.com/czepluch/gleeth",
          "versions_count": 8,
          "total_downloads": 8223,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 2038,
          "first_published_at": "2026-03-19T00:04:21.491563Z",
          "latest_published_at": "2026-04-21T15:55:58.123032Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 98
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "mise.toml"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 5662,
      "source_files_sampled": 2,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 4791
    },
    "dependencies": {
      "manifests": [],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [],
      "dependencies": [],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 2,
        "closed_ratio": 0.952,
        "closed_issues": 40,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "czepluch",
          "commits": 92,
          "avatar_url": "https://avatars.githubusercontent.com/u/1026799?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "test.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 10,
            "reason": "project is fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "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": "d4eef4da887e505042177158137efce6911579fc",
        "ran_at": "2026-07-29T04:02:27Z",
        "aggregate_score": 3.8,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-04-21T15:52:08Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 23,
          "created_at": "2026-03-19T00:38:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 25,
          "created_at": "2026-03-19T00:38:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/czepluch/gleeth",
    "host": "github.com",
    "name": "gleeth",
    "owner": "czepluch"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 49,
      "inputs": {
        "security": 38,
        "vitality": 56,
        "community": 32,
        "governance": 58,
        "engineering": 56
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 56,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "at_risk",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 33,
            "inputs": {
              "commits_last_year": 92,
              "human_commit_share": 1,
              "days_since_last_push": 98,
              "active_weeks_last_year": 8
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 98 days ago",
                "points": 9.9,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 98
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "92 commits in the last year",
                "points": 17.7,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 92
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "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": 90,
            "inputs": {
              "releases_count": 8,
              "latest_release_tag": "v1.7.0",
              "releases_from_tags": false,
              "days_since_latest_release": 97,
              "mean_days_between_releases": 4.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "8 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 97 days ago",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 97
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.9
                    }
                  }
                ],
                "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": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 32,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 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": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "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": 55,
            "inputs": {
              "packages": [
                "gleeth"
              ],
              "dependents": null,
              "ecosystems": "hex",
              "total_downloads": 8223,
              "monthly_downloads": 2038
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "2,038 downloads/month across hex",
                "points": 44.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 2038,
                      "ecosystems": "hex"
                    }
                  }
                ],
                "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": 58,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 2,
              "closed_issues": 40,
              "issue_closed_ratio": 0.952,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "95% of issues closed",
                "points": 44.5,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 95
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "followers": 64,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "czepluch",
              "public_repos": 65,
              "account_age_days": 5440
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "64 followers of czepluch",
                "points": 13,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 64,
                      "login": "czepluch"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "65 public repos, account ~14 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 65
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 14
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "gleeth"
              ],
              "ecosystems": "hex",
              "any_deprecated": false,
              "min_days_since_publish": 98
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on hex",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "hex"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 98 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 98
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "8 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 8
                    }
                  }
                ],
                "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": 56,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "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": "at_risk",
        "name": "Security",
        "value": 38,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 38,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3.8
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is fuzzed",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "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": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 58,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "good",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.707,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 4791
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "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": "65 of 92 human commits state their intent (structured subject or explanatory body)",
                "points": 37.7,
                "status": "partial",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 65,
                      "sampled": 92
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [
                "mise.toml"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "mise.toml",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "mise.toml"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": 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": "no agent-authored commits among the last 92",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 92
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "primary_language": "Gleam",
              "largest_source_bytes": 5662,
              "source_files_sampled": 2,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Gleam without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Gleam"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/2 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 2,
                      "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T04:02:32.021304Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/c/czepluch/gleeth.svg",
  "full_name": "czepluch/gleeth",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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