Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.31.0 · метрики 2.5.0 · 2026-08-07 05:37 UTC

zif-terminal / lib

Share go module for zif

GoЛіцензію не виявлено★ 0 зірок⑂ 0 форківз груд. 2025 р.Переглянути на GitHub ↗
ТипБібліотекаяк це визначено

zif-terminal/lib має індекс здоров’я 47 зі 100, що відповідає смузі «Слабкий». Найвищий показник — Vitality (74/100), найнижчий — Community & Adoption (12/100). Останнє оновлення було 15 днів тому. Більшість нещодавньої роботи виконує один учасник.

47
загалом / 100
Слабкий

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

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

47
Винятковий93-100Верхній щабель реєстру (≈ топ-5%); відповідає практично всім перевіреним критеріям
Відмінний80-92Сильний за всіма напрямами; незначні прогалини
Добрий65-79Здоровий; прогалини обмежені та керовані
Помірний50-64Прийнятний, але з помітними прогалинами; рекомендовано перевірку
Слабкий35-49Суттєві недоліки в кількох сферах
У зоні ризику20-34Суттєві слабкі місця; впровадження потребує обережності
Критичний1-19Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

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

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

Зважений загальний бал 48 калібровано до 47 за шкалою опублікованого індексу (калібрування реєстру 2026-08-02).

Власність

zif-terminalОрганізація
0 підписників2 публічні репозиторіїз груд. 2025 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Gogithub.com/zif-terminal/libv1.40.0-7715 днів тому

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

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

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

74Добрий · 21% загального індексу
Як обчислюється оцінка
28.8/36Свіжість push — останній push 15 дн. тому
11.8/36Ритм комітів — 17/52 тижнів із комітами
18/18Обсяг комітів — 196 комітів за останній рік
6/10OpenSSF Scorecard: Maintained — 8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6
Використані вхідні дані
commits_last_year196
human_commit_share1
days_since_last_push15
active_weeks_last_year17
Як обчислюється оцінка
16.2/27Випускає релізи — 79 тегів версій (без релізів GitHub)
36/36Свіжість релізів — останній реліз 15 дн. тому
27/27Ритм релізів — реліз кожні ~14 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count79
latest_release_tagv1.40.0
releases_from_tagsтак
days_since_latest_release15
mean_days_between_releases14
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

12Критичний · 17% загального індексу
Як обчислюється оцінка
0/60Зірки — 0 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

Здоров'я спільноти

25У зоні ризику
Як обчислюється оцінка
22.5/22.5README
0/22.5Ліцензія — файлу ліцензії не виявлено
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseні
readme_badges3
has_contributingні
has_issue_templateні
has_code_of_conductні
readme_badge_servicesgithub.com, shields.io
has_pull_request_templateні

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

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

53Помірний · 23% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0.2/22.5Розподіл комітів — головний контриб’ютор — автор 99% комітів
2.7/13.5Широта контриб’юторів — 2 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled2
top_contributor_share0,99
Як обчислюється оцінка
42/42Вирішення issue — закрито 100% issue
28.4/30Прийняття PR — злито 72/76 вирішених PR
0/13Newcomer PR acceptance — за 30 дн. не вирішено жодного PR від новачка
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs72
open_issues0
closed_issues4
prs_merged_7d0
prs_decided_7d0
prs_merged_30d3
prs_decided_30d3
issue_closed_ratio1
closed_unmerged_prs4
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
Виключено з оцінювання (немає даних або не застосовно): newcomer_pr_acceptance. Залишкові ваги перенормовано.
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
0/25Охоплення власника — 0 підписників у zif-terminal
4.8/25Послужний список — 2 публічних репозиторіїв, вік облікового запису ~0 р.
Використані вхідні дані
followers0
owner_typeOrganization
is_verified
owner_loginzif-terminal
public_repos2
account_age_days249

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

100Винятковий
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у go
35/35Свіжість публікацій — остання публікація 15 дн. тому
20/20Історія версій — 77 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgithub.com/zif-terminal/lib
ecosystemsgo
any_deprecatedні
min_days_since_publish15

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

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

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

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

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

Безпека

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

36Слабкий · 16% загального індексу

Стан безпеки

36Слабкий
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2/2.5CI-Tests — 5 out of 6 merged PRs checked by a CI test -- score normalized to 8
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
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5Ліцензія — license file not detected
4.5/7.5Maintained — 8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6
0/5Packaging — немає даних
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,6
Виключено з оцінювання (немає даних або не застосовно): packaging, signed_releases. Залишкові ваги перенормовано.

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

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Має свідомо малу вагу (4%): агентний інструментарій — реальний сигнал супроводу, але репозиторій без нього все одно може отримати 100/100.

63Помірний · 4% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 99 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
12.6/18Розгортання однією командою — go.mod (домовленість інструментарію, без раннера задач)
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — lockfile
10/10Підтверджена практика роботи з агентами — 72 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0,72
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
53.9/55Керовані розміри файлів — 2/100 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes153 902
source_files_sampled100
oversized_source_files2

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

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

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

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

Докладніше

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

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

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
8CI-Tests5 out of 6 merged PRs checked by a CI test -- score normalized to 8
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
6Maintained8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6
н/дPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Прямі залежності 3
РеєстрПакетОбмеження версіїМаніфест
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/machinebox/graphqlv0.2.2go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Усі залежності не зібрано

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

Звіт у форматі JSON машиночитний
{
  "data": {
    "icon": {
      "bytes": 1519,
      "width": 420,
      "height": 420,
      "rejected": [],
      "collected": true,
      "media_type": "image/png",
      "source_url": "https://avatars.githubusercontent.com/u/247058040?v=4&s=256",
      "source_type": "avatar",
      "content_hash": "4ffa86fed1a11dba0dfd5ecb4530050145b372304c935b672d7e638f2a59146b",
      "candidates_considered": 1
    },
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 633,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Go": 1225730,
        "Shell": 5389
      },
      "pushed_at": "2026-07-22T18:05:29Z",
      "created_at": "2025-12-01T00:24:59Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-22T16:29:18Z",
      "description": "Share go module for zif",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "zif-terminal",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/247058040?v=4",
      "created_at": "2025-12-01T00:09:22Z",
      "is_verified": null,
      "public_repos": 2,
      "account_age_days": 249
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v2.1.0",
          "kind": "minor",
          "published_at": "2026-03-19T01:42:43Z"
        },
        {
          "tag": "v2.0.0",
          "kind": "major",
          "published_at": "2026-03-18T23:32:34Z"
        },
        {
          "tag": "v1.40.0",
          "kind": "minor",
          "published_at": "2026-07-22T16:23:47Z"
        },
        {
          "tag": "v1.39.3",
          "kind": "patch",
          "published_at": "2026-07-22T09:53:24Z"
        },
        {
          "tag": "v1.39.2",
          "kind": "patch",
          "published_at": "2026-07-22T05:30:56Z"
        },
        {
          "tag": "v1.39.1",
          "kind": "patch",
          "published_at": "2026-07-21T18:11:30Z"
        },
        {
          "tag": "v1.39.0",
          "kind": "minor",
          "published_at": "2026-05-28T21:51:38Z"
        },
        {
          "tag": "v1.38.0",
          "kind": "minor",
          "published_at": "2026-04-19T15:50:17Z"
        },
        {
          "tag": "v1.37.0",
          "kind": "minor",
          "published_at": "2026-04-17T04:38:30Z"
        },
        {
          "tag": "v1.36.1",
          "kind": "patch",
          "published_at": "2026-04-17T00:15:12Z"
        },
        {
          "tag": "v1.36.0",
          "kind": "minor",
          "published_at": "2026-04-15T04:47:37Z"
        },
        {
          "tag": "v1.35.4",
          "kind": "patch",
          "published_at": "2026-04-14T23:18:41Z"
        },
        {
          "tag": "v1.35.3",
          "kind": "patch",
          "published_at": "2026-04-14T22:45:21Z"
        },
        {
          "tag": "v1.35.2",
          "kind": "patch",
          "published_at": "2026-04-14T22:28:46Z"
        },
        {
          "tag": "v1.35.1",
          "kind": "patch",
          "published_at": "2026-04-14T22:04:03Z"
        },
        {
          "tag": "v1.35.0",
          "kind": "minor",
          "published_at": "2026-04-12T21:27:10Z"
        },
        {
          "tag": "v1.34.2",
          "kind": "patch",
          "published_at": "2026-04-11T02:52:43Z"
        },
        {
          "tag": "v1.34.1",
          "kind": "patch",
          "published_at": "2026-04-10T23:58:41Z"
        },
        {
          "tag": "v1.34.0",
          "kind": "minor",
          "published_at": "2026-04-10T00:04:13Z"
        },
        {
          "tag": "v1.33.1",
          "kind": "patch",
          "published_at": "2026-03-28T17:40:59Z"
        },
        {
          "tag": "v1.33.0",
          "kind": "minor",
          "published_at": "2026-03-26T05:52:15Z"
        },
        {
          "tag": "v1.32.4",
          "kind": "patch",
          "published_at": "2026-03-24T19:40:17Z"
        },
        {
          "tag": "v1.32.3",
          "kind": "patch",
          "published_at": "2026-03-23T22:27:46Z"
        },
        {
          "tag": "v1.32.2",
          "kind": "patch",
          "published_at": "2026-03-23T21:02:01Z"
        },
        {
          "tag": "v1.32.1",
          "kind": "patch",
          "published_at": "2026-03-23T19:52:56Z"
        },
        {
          "tag": "v1.32.0",
          "kind": "minor",
          "published_at": "2026-03-23T01:03:20Z"
        },
        {
          "tag": "v1.31.1",
          "kind": "patch",
          "published_at": "2026-03-21T01:34:25Z"
        },
        {
          "tag": "v1.31.0",
          "kind": "minor",
          "published_at": "2026-03-20T23:55:18Z"
        },
        {
          "tag": "v1.30.0",
          "kind": "minor",
          "published_at": "2026-03-19T20:10:18Z"
        },
        {
          "tag": "v1.29.0",
          "kind": "minor",
          "published_at": "2026-03-19T01:42:43Z"
        },
        {
          "tag": "v1.28.1",
          "kind": "patch",
          "published_at": "2026-03-18T01:25:11Z"
        },
        {
          "tag": "v1.28.0",
          "kind": "minor",
          "published_at": "2026-03-15T17:16:40Z"
        },
        {
          "tag": "v1.27.0",
          "kind": "minor",
          "published_at": "2026-03-15T08:54:34Z"
        },
        {
          "tag": "v1.26.0",
          "kind": "minor",
          "published_at": "2026-03-15T05:14:35Z"
        },
        {
          "tag": "v1.25.1",
          "kind": "patch",
          "published_at": "2026-03-15T05:14:35Z"
        },
        {
          "tag": "v1.25.0",
          "kind": "minor",
          "published_at": "2026-03-15T03:00:30Z"
        },
        {
          "tag": "v1.24.2",
          "kind": "patch",
          "published_at": "2026-03-14T20:57:59Z"
        },
        {
          "tag": "v1.24.1",
          "kind": "patch",
          "published_at": "2026-03-14T03:36:55Z"
        },
        {
          "tag": "v1.24.0",
          "kind": "minor",
          "published_at": "2026-03-14T02:29:48Z"
        },
        {
          "tag": "v1.23.0",
          "kind": "minor",
          "published_at": "2026-03-13T20:52:25Z"
        },
        {
          "tag": "v1.22.2",
          "kind": "patch",
          "published_at": "2026-03-13T03:29:05Z"
        },
        {
          "tag": "v1.22.1",
          "kind": "patch",
          "published_at": "2026-03-12T18:31:57Z"
        },
        {
          "tag": "v1.22.0",
          "kind": "minor",
          "published_at": "2026-03-12T17:04:43Z"
        },
        {
          "tag": "v1.21.1",
          "kind": "patch",
          "published_at": "2026-03-12T17:03:02Z"
        },
        {
          "tag": "v1.21.0",
          "kind": "minor",
          "published_at": "2026-03-12T08:46:53Z"
        },
        {
          "tag": "v1.20.0",
          "kind": "minor",
          "published_at": "2026-03-11T23:47:02Z"
        },
        {
          "tag": "v1.19.1",
          "kind": "patch",
          "published_at": "2026-03-11T23:02:06Z"
        },
        {
          "tag": "v1.19.0",
          "kind": "minor",
          "published_at": "2026-03-11T22:03:54Z"
        },
        {
          "tag": "v1.18.1",
          "kind": "patch",
          "published_at": "2026-03-11T20:02:45Z"
        },
        {
          "tag": "v1.18.0",
          "kind": "minor",
          "published_at": "2026-03-11T12:15:29Z"
        },
        {
          "tag": "v1.17.0",
          "kind": "minor",
          "published_at": "2026-03-10T20:36:26Z"
        },
        {
          "tag": "v1.16.1",
          "kind": "patch",
          "published_at": "2026-03-10T19:55:37Z"
        },
        {
          "tag": "v1.16.0",
          "kind": "minor",
          "published_at": "2026-03-10T17:51:06Z"
        },
        {
          "tag": "v1.15.1",
          "kind": "patch",
          "published_at": "2026-03-10T01:21:22Z"
        },
        {
          "tag": "v1.15.0",
          "kind": "minor",
          "published_at": "2026-03-10T01:18:50Z"
        },
        {
          "tag": "v1.14.2",
          "kind": "patch",
          "published_at": "2026-03-10T00:05:36Z"
        },
        {
          "tag": "v1.14.1",
          "kind": "patch",
          "published_at": "2026-03-09T17:47:16Z"
        },
        {
          "tag": "v1.14.0",
          "kind": "minor",
          "published_at": "2026-03-09T17:40:37Z"
        },
        {
          "tag": "v1.13.0",
          "kind": "minor",
          "published_at": "2026-03-09T07:11:49Z"
        },
        {
          "tag": "v1.12.0",
          "kind": "minor",
          "published_at": "2026-03-09T00:09:27Z"
        },
        {
          "tag": "v1.11.2",
          "kind": "patch",
          "published_at": "2026-02-17T23:12:34Z"
        },
        {
          "tag": "v1.11.1",
          "kind": "patch",
          "published_at": "2026-02-17T18:02:20Z"
        },
        {
          "tag": "v1.11.0",
          "kind": "minor",
          "published_at": "2026-02-15T23:19:37Z"
        },
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2026-02-15T22:11:36Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2026-02-13T04:51:02Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2026-02-13T02:12:48Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2026-02-11T18:54:39Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-02-08T01:11:25Z"
        },
        {
          "tag": "v1.5.2",
          "kind": "patch",
          "published_at": "2026-02-07T21:21:02Z"
        },
        {
          "tag": "v1.5.1",
          "kind": "patch",
          "published_at": "2026-02-07T21:12:18Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-02-04T02:40:52Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-02-04T01:21:20Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-02-03T06:26:45Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2025-12-23T00:22:49Z"
        },
        {
          "tag": "v1.1.3",
          "kind": "patch",
          "published_at": "2025-12-21T18:30:23Z"
        },
        {
          "tag": "v1.1.2",
          "kind": "patch",
          "published_at": "2025-12-19T04:46:55Z"
        },
        {
          "tag": "v1.1.1",
          "kind": "patch",
          "published_at": "2025-12-15T19:21:39Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2025-12-14T21:25:10Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2025-12-10T20:57:42Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "42227bd93901bd7edd37fc35708452230342ee50",
          "body": "Implements the Jaison-approved force-reset purge rule at the reset-primitive\nlayer. Every money-table row carries an `origin` (gateway|upload|derived|manual,\nadded in Stage A). A force-reset / full reprocess must purge derived+manual\n(regenerable / disallowed) and NEVER wipe gateway+upload (irreplac\n[…]\n.\n\nRefs #204, #240\n\n\nClaude-Session: https://claude.ai/code/session_01Ww1rWnKu1dcfkK57i1UmGu\n\nCo-authored-by: Jaison Titus <maan.shiv@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(#240): origin-aware force-reset purge primitives (#204 rule) (#78)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-07-22T16:23:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "116770bccf501754384e544297a8f7f9dbf503d2",
          "body": "The /authority/{wallet}/snapshots/earn endpoint is wallet-scoped and returns\nsnapshots for ALL sub-accounts under a wallet. FetchHistoricalBalanceSnapshots\nis called once per sub-account, so a wallet with N sub-accounts re-downloaded\nthe identical full payload N times per sync cycle, then filtered i\n[…]\nown filtered data.\n\n\nClaude-Session: https://claude.ai/code/session_01Ww1rWnKu1dcfkK57i1UmGu\n\nCo-authored-by: Jaison Titus <maan.shiv@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(drift): cache earn API response across sub-accounts (#50) (#80)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-07-22T09:53:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7510fe8f0f8194475ca17aad79907b62b640d8d",
          "body": "HL vault deposits/withdrawals are INTERNAL to the user's own equity, not\nexternal cashflow. transformLedgerEntry booked a vaultDeposit/vaultCreate as\na phantom TypeWithdraw (understating net_deposits by the deposited principal)\nand vaultDistribution/vaultWithdraw as a TypeDeposit (phantom inflow).\n\n\n[…]\nocessor follow-up.\n\n\nClaude-Session: https://claude.ai/code/session_01Ww1rWnKu1dcfkK57i1UmGu\n\nCo-authored-by: Jaison Titus <maan.shiv@gmail.com>\nCo-authored-by: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hyperliquid): treat vault movements as internal transfers (#79)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-07-22T05:30:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2c0f68cb23cd890c11c614badfa8bf68b60114b7",
          "body": "…st refetch)\n\nThe Lighter cache-forever allowlist matched endpoints by bare substring, so the\nfirst/tail page (no &cursor=, newest data) of positionFunding/trades/etc was\npinned forever and never re-fetched — froze downstream funding/Analytics. Gate\non \"&cursor=\" so only immutable cursor pages cache\n[…]\nana_dex &before= guard. Matches the fix already shipped in the gateway.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01Ww1rWnKu1dcfkK57i1UmGu",
          "is_bot": false,
          "headline": "fix(#266): gate Lighter cache-forever on &cursor= (first-page tail mu…",
          "author_name": "Jaison Titus",
          "author_login": "Maanasa02",
          "committed_at": "2026-07-21T18:11:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "21730a0443c5e0956fcc4f2b691dc5185c37d968",
          "body": "FetchDeposits now queries the \"reward\" event_type alongside\ndeposit/withdrawal/fee and maps it to models.TypeReward. Rewards and\nrefunds (referral rewards, loss refunds) are positive USDC inflows that\nthe processor books to reward_pnl as income, so the amount is forced\npositive (stray sign stripped)\n[…]\n audit.\n\nAlso decode OmniRawEvent.TimestampMs from a JSON string, since Hasura\nserializes numeric columns as strings (STRINGIFY_NUMERIC_TYPES).\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(variational): ingest reward/refund events from omni raw events",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-05-28T21:51:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f803baffce77be0d815c3355378629ddef664b9",
          "body": "Changes:\n- Add post-filter in fetchAllFunding to drop entries with time < startTime (HL API bug)\n- Prevents stale funding rows from slipping past the cursor during pagination\n- Prior commit: AssetState.Balance derived from spot positions refactor\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "session(2026-05-27): HL funding pagination stale-entry post-filter",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-05-27T21:22:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "23b4966b7282d4474e9cde4438fb19e69ffc6f56",
          "body": "Eliminates the parallel imperative Balance field on AssetState. Spot\npositions are now the single source of truth; the asset's current\nbalance is computed by summing open spot positions for that asset\n(long contributes +Quantity, short contributes -Quantity). Closed\npositions contribute zero by FIFO\n[…]\nwn fields). On\nreload the derived Balance(symbol) reproduces the value exactly from\nthe persisted positions slice — no migration step required.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(models): derive AssetState.Balance from spot positions",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-05-25T22:17:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d2e9254f100aec68a746e7eb0607c5a7428b72e",
          "body": "…ghter $0 row + helius fixes\n\nThis session's changes:\n- HL transformer: spot_meta lookup, pagination dedup, manual_adjustments support\n- Drift: price attach in live, discovery + client refactor with retry handling\n- Lighter: zero-row emission for zero-balance positions, pagination dedup, cache smoke\n[…]\nverage-cost cutover (spot_balance_snapshot model updated)\n- manual_adjustments: new db model + tests + HL transformer wiring\n- db: transfer.go expanded, snapshot/client/checkpoint helpers for new flow",
          "is_bot": false,
          "headline": "session(2026-05-25): rewards split + current value + drift price + li…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-05-25T20:08:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b1c229a651f1465ee67320beed677d321bf5ec59",
          "body": "… orphans\n\nposition_events.event_id references trades/transfers/settlements without an\nFK constraint, so deleting only ingested rows on sync_reset leaves orphan\nposition_events that poison the cross-account missing_position_pnl view\nand stall every processor batch (one bad event errors all 21 checkp\n[…]\ntion_events and position_pnl) and DeleteCheckpoint inside\nDeleteSyncedData. Sync reset becomes \"wipe ingested + derived together.\"\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(db): DeleteSyncedData also wipes derived position data to prevent…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-05-03T08:59:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "74d391c2a646b3dad3e38f319eb2fad2b19c629d",
          "body": "Adds DataComplete / DataCompleteNotes / DataCompleteCheckedAt fields to\nExchangeAccount and an UpdateAccountDataComplete DB helper. Used by\naccount_sync's R1/R2/R3 heuristic checks to mark accounts whose synced\nevent history is incomplete (so activity_processor can refuse to run on\nthem rather than silently produce wrong cost basis / pnl).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(accounts): add data_complete flag for partial-history detection",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-05-03T07:56:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e6ed7e9a7210308b23a4e76008b7e1f3a5691c78",
          "body": "…snapshot\n\nFor accounts using cross-margin (e.g. HYPE supplied as collateral against\nperp positions), Hyperliquid's marginSummary.totalRawUsd includes the\nmark-to-market notional of supplied spot tokens. Those same tokens are\nalso reported as separate spot balances. Combining totalRawUsd with\nspotUS\n[…]\nPE collateralized short, totalRawUsd\n$15,798 vs accountValue $1,448) and updates the existing\nFetchBalances test for the new math.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hyperliquid): exclude cross-margin collateral from combined USDC …",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-05-03T06:30:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c9ad9524915540ea606525d9477396605538f770",
          "body": "…let_type\"\n\nThis reverts commit 84048bdd34d20eb84dd222ad2cd73e6182306a55.",
          "is_bot": false,
          "headline": "Revert \"feat(hyperliquid): emit separate perp/spot snapshots with wal…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-28T03:47:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "876e31b562c96394dad3c47498377d8d9d50d9d3",
          "body": "…rp for sub-accounts\"\n\nThis reverts commit b338733a5aa1469cedd7c73698a3bb818d2ba2e9.",
          "is_bot": false,
          "headline": "Revert \"feat(lighter): emit perp wallet snapshots with wallet_type=pe…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-28T03:47:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b338733a5aa1469cedd7c73698a3bb818d2ba2e9",
          "body": "…ub-accounts\n\nPhase 1 iter 3: extend FetchBalances on Lighter sub-accounts (account_type=1)\nto tag the USDC collateral row as wallet_type=perp and emit one row per open\nperp position from accounts[].positions[]. Position size is signed so shorts\npass through as negatives. Main accounts (account_type\n[…]\nhe new\nperp-position emission path, the renamed wallet_type on the collateral row,\nand explicit spot tagging on main-account rows.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(lighter): emit perp wallet snapshots with wallet_type=perp for s…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-28T02:42:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "84048bdd34d20eb84dd222ad2cd73e6182306a55",
          "body": "Phase 1 iter 2: split the previously combined HL USDC snapshot into two\nrows tagged with wallet_type and emit per-coin perp position rows from\nclearinghouseState.assetPositions. Adds WalletType to BalanceSnapshot\nand SpotBalanceSnapshotInput, threads it through the DB write path\n(defaults empty -> \"\n[…]\n so\nthe column round-trips. Tests cover spot/perp USDC split, signed szi\nfor short positions, and the per-coin perp emission path.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hyperliquid): emit separate perp/spot snapshots with wallet_type",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-28T02:33:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c5cb6938f9acc312b93e688b13a372aa9f650eff",
          "body": "For some HL wallets the same on-chain consensus staking event surfaces\nin BOTH userNonFundingLedgerUpdates (as cStakingTransfer{isDeposit:...})\nAND delegatorHistory (as cDeposit/cWithdraw). Because the synthetic\ndelegatorHistory ExternalID is prefixed (cdeposit_/cwithdraw_) and the\nledger ExternalID\n[…]\n\ncovered, so the ledger path wins and we emit exactly one transfer per\non-chain event regardless of which endpoint(s) reported it.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hyperliquid): dedupe cDeposit when also surfaced as cStakingTransfer",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-27T23:53:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5f82eaa9a1db74181ca4c7dc996b2470f3e14746",
          "body": "…ore sinceMs",
          "is_bot": false,
          "headline": "fix(hyperliquid): client-side filter for delegatorHistory entries bef…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-27T23:14:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bee685bf0dbafacbf3ec2a8c87ea2197e8697557",
          "body": null,
          "is_bot": false,
          "headline": "fix(hyperliquid): skip self-sends in ledger ingestion",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-27T21:08:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e53d2095fe64e3b3525a2be0ba5790cb3da85e4",
          "body": "…History\n\ncDeposit events (HYPE moving into consensus staking) are not reported by\nuserNonFundingLedgerUpdates, so they were silently ignored — leaving a\nphantom HYPE long position equal to the staked amount. The matching return\n(cStakingTransfer{isDeposit:false}) does appear in the non-funding ledg\n[…]\neposit. Other\nevent types (delegate, undelegate, withdrawal lifecycle) don't affect\ntrading balance and are intentionally ignored.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hyperliquid): track HYPE staking cDeposit outflows from delegator…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-27T19:40:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a0db1c258c0cc1bdc47984357eef52a8db93acf7",
          "body": "Realized PnL on open positions was never being booked because the\nmissing_position_pnl view filtered to closed positions only. The view\nnow surfaces stale rows (position_pnl whose created_at is older than\nthe latest position_event for that position), so created_at must\nfunction as last-computed-at a\n[…]\n on every upsert.\nWithout this, the processor's ProcessPositionPnL loop would re-surface\nthe same row forever and never terminate.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(db): bump position_pnl.created_at on upsert for staleness detection",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-27T08:10:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "99f7c3e0f308ad954667441964f12ed4c362e415",
          "body": null,
          "is_bot": false,
          "headline": "fix(hyperliquid): handle subAccountTransfer ledger events",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-27T08:09:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd7a59dcf24bb1e59dc6e896de7e04551717d20e",
          "body": "Lighter cross-margin sub-accounts (account_type=1) always report\nassets[].balance as 0 because the USDC collateral is pooled at the\naccount level in the `collateral` / `available_balance` fields. The\nprevious FetchBalances implementation only read from assets[], so\nsub-accounts produced empty balanc\n[…]\nC snapshot using\nthe top-level collateral string. Main accounts (account_type=0)\ncontinue to use the per-asset balances as before.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(lighter): use collateral as USDC balance for sub-accounts",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-26T14:10:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "198ae825cc78f77ae536d2becc701d318115d2c9",
          "body": "Outgoing sends report a non-zero fee that is debited from the user's\nwallet in addition to the delivered amount. Without folding, we\nunder-record the debit and leave a phantom fee-sized residual on the\naccount. Incoming sends are left as-is since the fee is paid by the\nsender, not the recipient. Mirrors the withdraw/deposit fee fold.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hyperliquid): fold fee into send amount for outgoing transfers",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-24T12:01:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d0046316ef8350863fbd9071e6e118c592de0024",
          "body": "Hyperliquid's userNonFundingLedgerUpdates reports withdraws as\n{\"type\":\"withdraw\",\"usdc\":\"47999\",\"fee\":\"1.0\"} — the user is out\n48,000 total (47,999 delivered + 1 bridge fee to the arbitrum bridge).\nThe previous transformLedgerEntry recorded only the usdc field, leaving\na phantom residual equal to t\n[…]\nthan silently dropping it.\n\nAffected accounts need sync_reset_requested to re-ingest existing\ntransfers with the corrected amount.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hyperliquid): include bridge fee in withdraw amount",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-23T03:04:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d3bad9f772ba8dbe8e9aed31db21a8a2a3f9862f",
          "body": "Hyperliquid spot fills charge fees in the asset RECEIVED (USDH on a\nUSDH buy, USDC on a sell), but transformFill hardcoded FeeAsset=\"USDC\".\nDownstream the processor debited USDC for every buy, producing phantom\nUSDH=+x / USDC=-x positions for any account that traded a non-USDC spot\npair. HL's API al\n[…]\nle, transformFill error for missing\n  feeToken, spot buy honours FeeToken=USDH, FetchTrades propagates the\n  malformed-fill error.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hyperliquid): honour feeToken instead of hardcoding USDC",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-23T02:26:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05b0f92020d1481eab276265d111ebf04cd96140",
          "body": "Mutation updates ONLY the label column on exchange_accounts, guarded\nby account ID. Intended for one-shot discovery-time population of\naccount labels from FetchAccountName; callers are responsible for\nthe \"only fill when empty\" guard to avoid clobbering user-set values.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(db): add UpdateAccountLabel helper",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-22T12:56:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5728b8f488030dc8c2eea4d37c1751d5126638b0",
          "body": "Surface the exchange-assigned display name for an account so discovery-time\nflows can auto-populate the `label` column on new exchange_accounts rows.\n\n- Hyperliquid: queries the subAccounts endpoint using the master wallet from\n  account_type_metadata[\"master_wallet\"]; matches subAccountUser\n  case-\n[…]\neAccount /\nExchangeAccountInput and extends CreateAccount to forward it in the\ninsert_exchange_accounts_one mutation when non-nil.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add FetchAccountName to ExchangeClient",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-22T06:38:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09d070cbf0979da1e7417a4def33d254715dc85c",
          "body": "Hyperliquid: fix pagination boundary dedup, supplement userFillsByTime with\nuserFills, skip self-sends (spot<->perp), add cStakingTransfer/vaultWithdraw\nhandlers, borrow/lend interest sync via userBorrowLendInterest, combined\nperp+spot USDC snapshots using totalRawUsd, send pricing from usdcValue,\ns\n[…]\nrocessorReset), OrSyncResetRequested/\nOrProcessorResetRequested filter fields.\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: HL pagination & interest, Lighter API refactor, DB resets (#77)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-19T15:50:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "56d80f80be47db280b288e8cfcb2de9e9122232c",
          "body": "Add SyncResetRequested/ProcessorResetRequested flags to Account model,\n4 new DB methods for reset lifecycle (GetResetRequestedAccounts,\nDeleteSyncedData, DeleteProcessedData, ClearResetFlag), fix HL\ninternalTransfer direction detection, and update interface + tests.\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add account reset methods and model fields (#76)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-17T04:38:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b6be70dc463f05198721440880f211322b0aa893",
          "body": "…e (#75)\n\n* feat(phase-0): lighter+variational, unified processor, omni_raw\n\nIntroduces full Lighter exchange client (auth, discovery, pagination, ratelimit,\nmarkets, types) and Variational client scaffold. Expands HL with spot_meta.\nAdds db/omni_raw_events for OMNI CSV import pipeline. Reworks db a\n[…]\no-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(phase-0): drift dedup, HL pagination, account filters, price cach…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-17T00:15:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "758b1c3fde5182bce64ff2aad015ee204be9c202",
          "body": "* feat(hyperliquid): add Hyperliquid exchange client\n\nImplements the ExchangeClient interface for Hyperliquid with support for\nfetching trades, funding payments, deposits, and balances via the\napi.hyperliquid.xyz/info REST API. Includes account discovery via\nclearinghouse state, startTime-based pagi\n[…]\no-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hyperliquid): add Hyperliquid exchange client (#74)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-15T04:47:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6fcfc49a12480a141216b66b15d3dab6555efe52",
          "body": "* fix: correct swap test data to match Drift API semantics\n\nDrift swap API: Out=what user RECEIVES, In=what user SENDS (from the\nprotocol's perspective: user puts tokens IN, gets tokens OUT). The\nproduction side logic was already correct but test mock data had the\nsemantics inverted. Fixed test comm\n[…]\no-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: catch silent drops on unresolvable market indices (#73)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-14T23:18:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0540393ef72bf3dc854f27552a0a2a9bb4f92bd9",
          "body": "Drift swap API: Out=what user RECEIVES, In=what user SENDS (from the\nprotocol's perspective: user puts tokens IN, gets tokens OUT). The\nproduction side logic was already correct but test mock data had the\nsemantics inverted. Fixed test comments and mock data to match real API\nbehavior while keeping the same expected trade output.\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: correct swap test data to match Drift API semantics (#72)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-14T22:45:21Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cde0fbaa8cfa54398ba945d1625c1f267519c870",
          "body": "…#71)\n\nThe Drift swap API uses Out=what leaves user's account, In=what enters.\nThe code had buy/sell inverted: when USDC went out (user buying), it was\nmarked as \"sell\", and vice versa. This caused every swap's USDC balance\neffect to be reversed, creating ~$1.9M false interest on accounts with\nsigni\n[…]\nformSwap that returns an error if resolved\nbase_asset or quote_asset is empty.\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: correct swap buy/sell side inversion and add empty-asset guard (…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-14T22:28:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a94df8255e89a97e2e0e1a74fbb17626136499b8",
          "body": "…#70)\n\nThe Drift API's OutSymbol/InSymbol fields are not populated for swap\nrecords, causing 146 trades to be saved with empty base_asset and\nquote_asset. Use getMarketInfo (market index resolution with hardcoded\nfallbacks) instead. Also adds new perp/spot market index mappings,\nHasSeenSnapshot to AccountState, and GetDistinctTransferAssets.\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve swap market indices instead of using empty API symbols (…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-14T22:04:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "10eaaaad8ebdf17d5b542de52cba87b953718366",
          "body": "- Add system_flags table support (GetFlag, SetFlag, CompareAndSetFlag)\n- Add UpsertPositions with natural key dedup for stable position IDs\n- Add DeletePositionEventsByPositionIDs for position event cleanup\n- Add DeleteCheckpoint for force replay support\n- Add Price field to EventEntry for PnL computation from fill prices\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: system flags, position upsert, checkpoint delete, entry prices",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-04-12T21:27:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bcfe22bb0ed03743e3ec296c760d556cfec9a5fa",
          "body": "* fix: prevent UNKNOWN market fallback in Drift client\n\nReturn errors instead of UNKNOWN-{index} when market resolution fails.\nCallers skip the record rather than persisting bad data.\n\n- getMarketInfo returns error instead of UNKNOWN fallback\n- ensureMarketCache pre-warms cache before processing bat\n[…]\no-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: hardcode Drift market index mappings as fallback (#69)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-11T02:52:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fdd76f2e7aedd2ce9ebe939b2d6a5b7bcaec6362",
          "body": "Return errors instead of UNKNOWN-{index} when market resolution fails.\nCallers skip the record rather than persisting bad data.\n\n- getMarketInfo returns error instead of UNKNOWN fallback\n- ensureMarketCache pre-warms cache before processing batches\n- Page fetchers skip individual records on market resolution failure\n- Tests updated with /stats/markets mock endpoint\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: prevent UNKNOWN market fallback in Drift client (#68)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-10T23:58:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "834c974e52474efbfca598533010e7db105395e8",
          "body": "* feat: add price cache models and DB methods\n\nAdd PriceRecord, PriceInput, and Price models for storing oracle prices\nfrom exchanges. Add AddPrices (batch upsert with dedup) and\nGetNearestPrice (tolerance-based lookup) DB methods.\n\nThe price cache enables cross-asset denomination conversion by stor\n[…]\no-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: price cache, oracle prices, and position PnL support (#67)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-04-10T00:04:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "174a8071d5baf7aa00f6e00b8f5d3a36425c122e",
          "body": "AddPositions and AddPositionEvents were sending all records in a single\nGraphQL mutation (~2700 positions, ~5000+ events). On the 4GB prod\ndroplet this overwhelmed Hasura, causing it to crash mid-write. This\nleft positions with zero linked events in the database.\n\nBoth functions now chunk writes into batches of 500 records.\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: batch position and event writes to prevent Hasura crashes (#66)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-28T17:40:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2899ddc16ac8ff2a27f399ec6112502467826859",
          "body": "feat: add event value models and database methods",
          "is_bot": false,
          "headline": "Merge pull request #65 from zif-terminal/feat/event-value-support",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-26T05:52:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c715506818e38f9709a16cf8f101112059a5c55",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add event value database method tests",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-26T05:01:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c99f7d1fce3de128d03e55c9ac1348bd5028af42",
          "body": "Add EventValue/MissingEventValue models, supported denominations query,\nmissing event values view query, bulk event fetchers (GetTradesByIDs,\nGetTransfersByIDs, GetSettlementsByIDs), and AddEventValues upsert.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add event value models and database methods",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-26T04:12:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "45f43ff0e1fab4b3fd6a65bf1c7c3ee2f793e38d",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #64 from zif-terminal/refactor/event-entry-rename",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-24T19:40:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee8950017748d2f9ab41aea96a2b060d678480c2",
          "body": "TradeEntry tracked all position-changing events (trades, transfers, interest,\nsettlements, rewards) not just trades. Rename to EventEntry with EventID field\nto reflect actual usage. Type alias preserves backward compatibility.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: rename TradeEntry to EventEntry for accuracy",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-24T19:36:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7979b8c85da506e28afdf76d4f800821bd667283",
          "body": "…asset",
          "is_bot": false,
          "headline": "Merge pull request #63 from zif-terminal/feat/remove-positions-quote-…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-23T22:27:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99495f596004973dcd4e2e38a7215eeb7e069bff",
          "body": "Position no longer stores price data (entry_price, exit_price dropped earlier),\nso quote_asset is dead weight. Denomination info now comes from trades via\nposition_events, and will be handled by event_denomination_values table.\n\n- Remove QuoteAsset from Position, PositionInput structs\n- Remove QuoteAsset from PositionState (processor in-memory state)\n- Remove from all GraphQL queries in db/position.go\n- Update tests\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: remove quote_asset from positions schema and PositionState",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-23T22:27:05Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8b17b3652e6b4c19bbc9c48987128ea05eb54a45",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #62 from zif-terminal/fix/remove-orphaned-price-cache",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-23T21:02:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "478bdc4cbc529ea0f4dcf3cabe6d11682e2af149",
          "body": "Tables were dropped in migration 1801000000 but Go code remained.\nRemoves models, DB methods, tests, and interface methods.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove orphaned price_cache code",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-23T20:18:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6fc4d5905c51aec5f8679ce77ac3703f2173c3b8",
          "body": "…rning\n\nfix: remove stale oracle_price from snapshot returning clause",
          "is_bot": false,
          "headline": "Merge pull request #61 from zif-terminal/fix/remove-oracle-price-retu…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-23T19:52:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f86958fbeb059d831a45ccd6f949baa7031d8e6c",
          "body": "… clause\n\nSnapshot models no longer have oracle_price — this was the last reference.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove stale oracle_price from AddSpotBalanceSnapshots returning…",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-23T19:47:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2ec216e6f4a7be72c646820da0386f43f93c07c7",
          "body": "feat: snapshot improvements and Drift earn endpoint",
          "is_bot": false,
          "headline": "Merge pull request #60 from zif-terminal/fix/remove-pnl-schema",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-23T01:03:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54fd26163cb8f4196adb81ebf43c1d3f8ba992dd",
          "body": "…pshots\n\n- Remove oracle_price from balance snapshot queries and types\n- Add Drift earn endpoint client and rate limiter\n- Update snapshot models with SpotBalanceSnapshot types\n- Handle empty string as zero in parseFloat64\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: snapshot improvements — remove oracle_price, add Drift earn sna…",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-23T00:15:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6cc6f31734881558d185d608857a6d859780fb92",
          "body": "Remove PositionPnlInput struct and UpsertPositionPnl from models, DB client,\nand interface — pnl_service was never deployed and these are dead code.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove unused PnL types and DB methods",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-22T21:09:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d7dc5a20f2de617be77ce7a5a2f6c032c44618ce",
          "body": null,
          "is_bot": false,
          "headline": "Merge pull request #58 from zif-terminal/fix/update-coverage-baseline",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-21T01:34:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5732eda0d6f486bca341dc44f83c406a090a01c4",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update coverage baseline to 65.5",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-21T00:10:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b7d9adb4a2124654a8048d99b031d5d511a58d21",
          "body": "…estamp\n\n- ExitEventType tracks what type of event closed a position (trade, interest, transfer)\n- LastSettlementTimestamp comment updated to deprecated\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add ExitEventType to PositionState, deprecate LastSettlementTim…",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-20T23:55:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a1e38ef38a78dfdcfd76d055ff21000f4f1c0c57",
          "body": "…, add DeleteDerivedTransfers\n\n- Remove CumulativeAdjustment from AssetState (all diffs are interest, not adjustments)\n- Add DeleteDerivedTransfers to DBClient interface and Client implementation\n  (deletes transfers with metadata source=\"derived\" for clean replay)\n- Update comment: snapshot used for interest derivation, not reconciliation\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: snapshot-driven interest derivation — drop CumulativeAdjustment…",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-19T20:10:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1b69a751111e5060a41aef4ebc0fcc9ab9c52c12",
          "body": "…estamps\n\nfeat: simplify checkpoint schema — per-type timestamps",
          "is_bot": false,
          "headline": "Merge pull request #56 from zif-terminal/feat/checkpoint-per-type-tim…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-19T01:42:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "362cb8e4b6809f5a6a1c82911d36dad1331b2d6b",
          "body": "Removed usd_value parsing and unified position structs reduced\ncovered lines without removing test coverage.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update coverage baseline to 65.8",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-19T01:41:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c92535503270c3847adfbc5ce53316b6595e213a",
          "body": "Single struct with IsClosed() derived from EndTime > 0. Removes\nduplicated fields across two nearly-identical structs.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: unify OpenPosition and ClosedPosition into PositionState",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-19T01:36:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ee1f113265ccf877d7bc5e09c3ad1e31be034df4",
          "body": "- Remove usd_value from BalanceSnapshot, SpotBalanceSnapshot, and all\n  snapshot queries/writes — derived values don't belong in stored data\n- Change TradingState from single struct to map[string]*TradingState\n  keyed by quote asset, preventing cross-denomination aggregation\n- Add GetOrCreateTrading(quoteAsset) helper for safe map access\n- Update test fixtures to use generic assets (SOL, BTC) instead of USDC\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: remove usd_value assumption, group TradingState by quote asset",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-19T01:36:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1a9a140a749394fbd1b05a54950918c28c6c2079",
          "body": "AvgEntryPrice, TotalEntryValue, TotalEntryQty, EntryPrice, and ExitPrice\nare meaningless without a common denomination system. Remove them from the\nshared model — they can be reintroduced when a pricing layer exists.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: remove price fields from position models",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-19T01:36:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "750b84e008bece4d4990bbc7da9b049792794d46",
          "body": "Use generic test value (7) instead of hardcoded 44 which was coupled\nto the activity_processor's checkpointSchemaVersion constant.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: decouple checkpoint test from processor-specific schema version",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-19T01:36:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c6e086de5bde5ec96c860a4ab01cdecc3bfa811d",
          "body": "- Move AccountState and related types (AssetState, OpenPosition, etc.) to lib/models\n- ProcessorCheckpoint.State is now *models.AccountState instead of json.RawMessage\n- SaveCheckpoint marshals to JSON internally\n- LoadCheckpoint unmarshals to typed struct internally\n- No raw JSON in the public API\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: move AccountState to lib/models, checkpoint State is now typed",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-19T01:36:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4303ef5df0ba44e5598d29057c72ebc90c77fb31",
          "body": "…ccepts timestamp filter\n\n- SaveCheckpoint now takes *ProcessorCheckpoint instead of individual args\n- GetAllBalanceSnapshots accepts afterTimestampMs param (pass 0 for all)\n- Remove unused encoding/json import from client.go\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: SaveCheckpoint takes typed struct, GetAllBalanceSnapshots a…",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-19T01:36:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ff181414cc9acabc545bd88877e34e1f2e62a923",
          "body": "…nt counts\n\nReplace event_counts JSON blob and LastEventTimestamp with per-type\ntimestamp columns (last_trade_timestamp, last_transfer_timestamp,\nlast_settlement_timestamp, last_snapshot_timestamp) and a proper\nschema_version column. Checkpoint validity now compares max timestamps\nper event type aga\n[…]\ninstead of counts.\n\nAlso adds GetAllBalanceSnapshots for multi-snapshot reconciliation\nand removes unused CostBasis field from transfer models.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: simplify checkpoint schema — per-type timestamps instead of eve…",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-19T01:36:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "547cd107efa0876aca5b6553a11b8637833af7cf",
          "body": "feat!: remove Hyperliquid and Lighter exchange implementations",
          "is_bot": false,
          "headline": "Merge pull request #57 from zif-terminal/feat/remove-hyperliquid-lighter",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-18T23:32:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "337490d803b22d6b011ab88dd41cd0d8f3d7a4cf",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update coverage baseline after exchange removal",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-18T23:31:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bb76219457a463425d4f27a849e40b8711c67e11",
          "body": "Only Drift is currently supported. This removes all Hyperliquid and Lighter\nclient code, tests, types, and documentation references. Adds ErrNotImplemented\nsentinel error for future exchange method stubs.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat!: remove Hyperliquid and Lighter exchange implementations",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-18T21:16:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a8dc757295298978e3e961fe009a25e99718164b",
          "body": "* fix: remove CostBasis from drift deposit transform\n\nThe cost_basis column was dropped from the transfers table but the\ndrift client still populated CostBasis on TransferInput, causing\nHasura to reject insert mutations at runtime.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n* chore: u\n[…]\nratio drop is expected.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove CostBasis from drift deposit transform (#55)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-18T01:25:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bc5eb5388b9e1afe0c6440f540302f85466bd923",
          "body": "Reflects removal of CostBasis test — code was also removed so\ncoverage ratio drop is expected.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update coverage baseline to 69.2%",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-18T01:19:42Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d55762f81fb9e5e6b074aff208a8e5a6df6cb3ca",
          "body": "The cost_basis column was dropped from the transfers table but the\ndrift client still populated CostBasis on TransferInput, causing\nHasura to reject insert mutations at runtime.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: remove CostBasis from drift deposit transform",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-18T00:23:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "62b36ee9382ad8c12edf86b94f8babc23c44b65d",
          "body": "Without this, pos.QuoteAsset is empty after insert, causing PnL\ndenomination to be blank in position_pnl records.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: include quote_asset in AddPositions returning clause",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-15T17:16:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "252829556d70e843199154374f1e6673d4d5a094",
          "body": "Co-authored-by: zif-dev-claw <zif-dev-claw@noreply>\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: drop position price columns, add UpsertPositionPnl (#54)",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-15T08:54:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "39bce667cdd411aead42cdcb4f29c23004945e79",
          "body": "refactor: replace PositionEvent with PositionTrade",
          "is_bot": false,
          "headline": "Merge pull request #53 from zif-terminal/feat/lib-position-trades",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-15T05:14:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c49015015d14433112badbd0b6682c33b8bccb0d",
          "body": "Keep the position_events table name since it links positions to all\nevent types (trades, transfers, funding), not just trades. Same new\nschema (no price/timestamp), just better naming.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: rename PositionTrade back to PositionEvent",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-15T05:09:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bfdc7926f7e148c3e23559231b957f9f53c0e029",
          "body": "Rename PositionEvent/PositionEventInput to PositionTrade/PositionTradeInput.\nThe new struct removes price and timestamp fields (those live on source\nevents) and updates all GraphQL mutations/queries to use the\nposition_trades table. Updates DBClient interface and tests accordingly.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: replace PositionEvent with PositionTrade",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-15T04:04:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d1d34953e1a50b4b642a9504949a41424b185b0f",
          "body": "…sfers\n\nfeat: add funding type and market/payment_id fields to transfers",
          "is_bot": false,
          "headline": "Merge pull request #52 from zif-terminal/feat/merge-funding-into-tran…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-15T03:00:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01adafd9d5b7dc8f4cd8433a6a2ad4bf90fb4b99",
          "body": "Removes FundingPayment/FundingPaymentInput models, DB methods, and\nupdates all exchange implementations to return TransferInput directly.\nFetchFundingPayments now returns []*TransferInput with type=\"funding\"\nand market/payment_id stored in metadata.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: remove FundingPayment type, unify through transfers",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-15T02:54:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b8a1f43e9023671ab7a3953f6df9286bc0515b2e",
          "body": "Replaces specific market and payment_id fields with a generic metadata\nmap for extensibility. Funding payments store market and payment_id\nin metadata; future event types can store whatever they need.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: use metadata JSONB instead of market/payment_id columns",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-15T02:02:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "95d7ea19a25f6042cc3d65d3bdb2491554547e2d",
          "body": "Support merging funding_payments into the transfers table by:\n- Adding TypeFunding constant to transfer types\n- Adding Market and PaymentID optional fields to Transfer and TransferInput\n- Including new fields in ListTransfers and AddTransfers GraphQL queries\n- Adding GetLatestTransferByType method f\n[…]\n transfer by type\n- Adding GetLatestTransferByType to DBClient interface\n\nExisting funding_payment methods are kept for backward compatibility.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add funding type and market/payment_id fields to transfers",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-15T01:45:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "560c1ab33c10792bf7b82560a63b2d20e30ce61a",
          "body": "…endpoint\n\nfix: use live endpoint for balance snapshots",
          "is_bot": false,
          "headline": "Merge pull request #51 from zif-terminal/fix/fetch-balances-use-live-…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-14T20:57:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6040730a786704745e2727a35ef7dee833b3ae95",
          "body": "…endency\n\nThe earn endpoint returns daily snapshots that can be stale and inconsistent\nwith actual live balances. Switch to /user/{accountId} which returns live\nspot balances. Oracle prices are no longer fetched from earn — a separate\nprice service will provide them.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use /user/{accountId} as primary balance source, remove earn dep…",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-14T20:56:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "dbd0bf03350eb77b16a671e48eee7be78ced697e",
          "body": "…ex-to-symbol\n\nfix: resolve marketIndex to symbol in earn snapshot balances",
          "is_bot": false,
          "headline": "Merge pull request #49 from zif-terminal/fix/earn-snapshot-market-ind…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-14T03:36:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f9bed28e43741039b26513b369dddfdcc0c3fbf7",
          "body": "The Drift earn API returns marketIndex but not symbol for each asset.\nfetchBalancesFromEarn was using asset.Symbol which is always empty,\ncausing all balance snapshots to be skipped (empty asset name filtered\nout by the snapshot syncer). This broke snapshot syncing for the main\naccount since lib v1.21.1 when FetchBalances switched to the earn\nendpoint.\n\nFix: use the market cache to resolve marketIndex → baseAsset symbol.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve marketIndex to symbol in earn snapshot balances",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-14T03:30:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "656452e0a39792978060e4f426efe519d1fb42cb",
          "body": "feat: add TimestampMs to BalanceSnapshot",
          "is_bot": false,
          "headline": "Merge pull request #48 from zif-terminal/feat/balance-snapshot-timestamp",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-14T02:29:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee11e6e91581286aa3e742ed3bfd63be1b445b86",
          "body": "Include the snapshot timestamp in GetLatestBalanceSnapshots results so\nthe activity_processor can check staleness — only reconcile spot\npositions against snapshots that are newer than the latest event.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add TimestampMs to BalanceSnapshot",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-14T02:24:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ad9c3647b89e48c8a25a1e8328c5e7eced8a3b5d",
          "body": "feat: remove order_id, realized_pnl, pnl_denomination from positions",
          "is_bot": false,
          "headline": "Merge pull request #47 from zif-terminal/feat/remove-position-pnl-fields",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-13T20:52:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89701b624604b8547f1fc76dba42314b01246530",
          "body": "PnL is now computed externally via the position_pnl table instead of\nbeing stored inline on each position row. order_id was unused.\n\nRemoves UpdatePositionPnL and GetPositionsWithNullPnL DB methods,\ndrops the fields from Position/PositionInput structs, and cleans up\nassociated tests.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: remove order_id, realized_pnl, pnl_denomination from positions",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-13T20:17:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a645ed640552e4acf63406bb57eba7b9a208b98f",
          "body": "…raint\n\nThe AddTransfers mutation was using on_conflict with transfers_pkey, which only\nhandles conflicts on the primary key (id). However, the transfers table has a\nunique constraint on (exchange_account_id, type, asset, timestamp) to prevent\nduplicate records for the same event.\n\nWhen interest rec\n[…]\n to succeed by ignoring duplicates, fixing the infinite\nerror loop in account_sync when interest records already exist.\n\nFixes account_sync#64 (interest reconciliation blocked after container restart)",
          "is_bot": false,
          "headline": "fix: handle duplicate transfer records with correct on_conflict const…",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-13T03:29:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4b31450e20a33fa07b7943ab97ea961656fc3976",
          "body": "fix: add diagnostic logging for Drift API empty responses",
          "is_bot": false,
          "headline": "Merge pull request #45 from zif-terminal/fix/deposit-sync-diagnostics",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-12T18:31:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2c61874da41c03b8f08da75435b44730d30d973",
          "body": "When fetchWithHistory returns 0 items, log whether the API itself\nreturned empty records (with the URL for manual testing) or if all\nrecords were filtered by the since timestamp. This makes it easy to\ndistinguish between \"Drift API has no data\" and \"records exist but\nare older than since\".\n\nRefs: account_sync#49, account_sync#53",
          "is_bot": false,
          "headline": "fix: add diagnostic logging when Drift API returns 0 records",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-12T18:07:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49b541b781c9558dff44e56427dc20ea5e38f74a",
          "body": "feat: add VerifyWalletByDetection DB method",
          "is_bot": false,
          "headline": "Merge pull request #44 from zif-terminal/fix/wallet-verify-by-detection",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-12T17:04:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2224e3d03f84f4fc2c33a0fb6f0f853af7a6aa8",
          "body": "…shots\n\nfix: use earn snapshots for complete balance fetching",
          "is_bot": false,
          "headline": "Merge pull request #43 from zif-terminal/fix/fetch-balances-earn-snap…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-12T17:03:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25808b714129bcfcb0b3e7649cd34ac9dc7ef557",
          "body": "New DB method that sets verified_at and verification_method='detected'\non wallets that haven't been verified by a stronger method. Used by\naccount_detector to mark wallets as verified when exchange accounts\nare discovered, fixing the stuck verification issue.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add VerifyWalletByDetection method",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-12T16:59:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "264bae82a21e48ffd830a64a71927999765ee2f4",
          "body": "The /user/{accountID} endpoint only returns a subset of spot balances,\ncausing snapshots to be missing for bSOL, mSOL, JUP, FARTCOIN and other\nassets. The earn snapshots endpoint returns ALL spot assets with both\nbalance and oracle price data.\n\nFetchBalances now prefers the earn endpoint as primary data source and\nfalls back to the user endpoint when earn data is unavailable (e.g. no\nwallet metadata).\n\nCloses account_sync#59\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use earn snapshots for balance fetching to include all spot assets",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-12T16:36:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6d81eb14a90f6188d57dd21b17f8fd8a2e0974c2",
          "body": "…hots\n\nfeat: add ListSpotBalanceSnapshots for bulk snapshot retrieval",
          "is_bot": false,
          "headline": "Merge pull request #42 from zif-terminal/feat/list-spot-balance-snaps…",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-12T08:46:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5508bfb64df32935130171111cb75803e4d173e",
          "body": "Add ListSpotBalanceSnapshots(ctx, accountID, asset) method that returns\nall snapshots for an account+asset pair sorted by timestamp ascending.\n\nThis enables the interest reconciler to process all consecutive snapshot\npairs rather than only the latest one, which is needed to rebuild\nhistorical interest data after a purge.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add ListSpotBalanceSnapshots for bulk snapshot retrieval",
          "author_name": "zif-dev-claw",
          "author_login": null,
          "committed_at": "2026-03-12T08:42:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "47687d8bad864eff4657d50b2920f3164e4cfa0f",
          "body": "feat: pass realized_pnl through AddPositions mutation",
          "is_bot": false,
          "headline": "Merge pull request #41 from zif-terminal/feat/add-positions-pnl-fields",
          "author_name": "Jaison Titus",
          "author_login": "jaisontj",
          "committed_at": "2026-03-11T23:47:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 79,
      "commits_last_year": 196,
      "latest_release_at": "2026-07-22T16:23:47Z",
      "latest_release_tag": "v1.40.0",
      "releases_from_tags": true,
      "days_since_last_push": 15,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 15,
      "mean_days_between_releases": 14
    },
    "artifacts": {
      "collected": true,
      "structure": [
        "tree.go_importable"
      ],
      "declarations": []
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "readme_badges": {
        "hosts": [
          "github.com",
          "shields.io"
        ],
        "total": 3,
        "header": 3,
        "collected": true,
        "has_inspect_badge": false
      },
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 25,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/zif-terminal/lib",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "categories": [],
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/zif-terminal/lib",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "v1.40.0",
          "repository_url": "https://github.com/zif-terminal/lib",
          "versions_count": 77,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-22T16:23:47Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 15
        }
      ]
    },
    "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": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 153902,
      "source_files_sampled": 100,
      "oversized_source_files": 2,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "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": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/machinebox/graphql",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.2"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        }
      ],
      "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": 72,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 4,
        "closed_unmerged_prs": 4
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "jaisontj",
          "commits": 95,
          "avatar_url": "https://avatars.githubusercontent.com/u/13097323?v=4"
        },
        {
          "type": "User",
          "login": "Maanasa02",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/46577772?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.99
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "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": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 8,
            "reason": "5 out of 6 merged PRs checked by a CI test -- score normalized to 8",
            "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": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 6,
            "reason": "8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "42227bd93901bd7edd37fc35708452230342ee50",
        "ran_at": "2026-08-07T05:37:47Z",
        "aggregate_score": 3.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "recent_prs": {
        "merged_7d": 0,
        "decided_7d": 0,
        "merged_30d": 3,
        "authors_30d": 1,
        "decided_30d": 3,
        "sample_size": 60,
        "window_days": 30,
        "sample_exhausted": false,
        "authors_probed_30d": 1,
        "newcomer_merged_30d": 0,
        "bot_prs_excluded_30d": 0,
        "newcomer_authors_30d": 0,
        "newcomer_decided_30d": 0
      },
      "ci_last_run_at": "2026-07-22T16:25:55Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-22T16:23:48Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/zif-terminal/lib",
    "host": "github.com",
    "name": "lib",
    "owner": "zif-terminal"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "weak",
      "name": "Overall health",
      "note": "The weighted overall 48 is calibrated to 47 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 48,
            "calibrated": 47,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 47,
      "inputs": {
        "security": 36,
        "vitality": 74,
        "community": 12,
        "governance": 53,
        "calibration": "2026-08-02",
        "engineering": 54,
        "ai_readiness": 63,
        "weighted_overall_raw": 48
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 74,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "commits_last_year": 196,
              "human_commit_share": 1,
              "days_since_last_push": 15,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 15 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 15
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "196 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 196
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "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": 88,
            "inputs": {
              "releases_count": 79,
              "latest_release_tag": "v1.40.0",
              "releases_from_tags": true,
              "days_since_latest_release": 15,
              "mean_days_between_releases": 14
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "79 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 79
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 15 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 15
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~14 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 14
                    }
                  }
                ],
                "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": "exceptional",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 15,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 15 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 15
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 12,
        "weight": 0.17,
        "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": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "readme_badges": 3,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [
                "github.com",
                "shields.io"
              ],
              "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": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 53,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 12,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.99
            },
            "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 99% of commits",
                "points": 0.2,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 99
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "excellent",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 81,
            "inputs": {
              "merged_prs": 72,
              "open_issues": 0,
              "closed_issues": 4,
              "prs_merged_7d": 0,
              "prs_decided_7d": 0,
              "prs_merged_30d": 3,
              "prs_decided_30d": 3,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 4,
              "first_time_authors_30d": 0,
              "first_time_prs_merged_30d": 0,
              "first_time_prs_decided_30d": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 42,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "72/76 decided PRs merged",
                "points": 28.4,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 72,
                      "decided": 76
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "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": "weak",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "zif-terminal",
              "public_repos": 2,
              "account_age_days": 249
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of zif-terminal",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "zif-terminal"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "2 public repos, account ~0 yr old",
                "points": 4.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 2
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/zif-terminal/lib"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 15
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 15 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 15
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "77 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 77
                    }
                  }
                ],
                "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": 54,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 64,
            "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": "5 out of 6 merged PRs checked by a CI test -- score normalized to 8",
                "points": 16,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "weak",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "weak",
        "name": "Security",
        "value": 36,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 36,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 3.6
            },
            "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 is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "5 out of 6 merged PRs checked by a CI test -- score normalized to 8",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6",
                "points": 4.5,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "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": 63,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "weak",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.99,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.72,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "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": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "72 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 72,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 153902,
              "source_files_sampled": 100,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/100 source files over 60KB",
                "points": 53.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 100,
                      "oversized": 2
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library"
      ],
      "labels": [
        "library"
      ],
      "scores": {
        "library": 6
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:go",
          "weight": 3
        },
        {
          "tier": "structure",
          "label": "library",
          "source": "tree.go_importable",
          "weight": 3
        }
      ],
      "artifacts": [],
      "confidence": "medium",
      "host_extension": false,
      "runs_as_process": false,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-08-07T05:37:56.773254Z",
  "schema_version": "0.31.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/z/zif-terminal/lib.svg",
  "full_name": "zif-terminal/lib",
  "license_state": "absent",
  "license_spdx": null
}

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

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

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