Öffentliches Register
Software-GesundheitsberichtSchema 0.31.0 · Metriken 2.5.0 · 2026-08-07 05:37 UTC

zif-terminal / lib

Share go module for zif

GoKeine Lizenz erkannt★ 0 Sterne⑂ 0 Forksseit Dez. 2025Auf GitHub ansehen ↗

zif-terminal/lib erreicht einen Gesundheitsindex von 47 von 100 und liegt damit im Bereich Schwach. Am stärksten schneidet es bei Vitality (74/100) ab, am schwächsten bei Community & Adoption (12/100). Zuletzt vor 15 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

47
gesamt / 100
Schwach

Software-Gesundheitsindex

Metriken werden auf einer standardisierten Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr gewichtetes Mittel, kalibriert auf die Verteilung des öffentlichen Registers, sodass die Stufen Perzentilbedeutung tragen; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze Gefährdet von 34.

47
Außergewöhnlich93-100Die Spitzengruppe des Registers (≈ obere 5 %); erfüllt im Wesentlichen alle geprüften Kriterien
Exzellent80-92Durchgehend stark; geringfügige Lücken
Gut65-79Gesund; Lücken sind begrenzt und beherrschbar
Mittel50-64Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Schwach35-49Wesentliche Schwächen in mehreren Bereichen
Gefährdet20-34Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-19Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Der gewichtete Gesamtwert 48 wird auf der veröffentlichten Indexskala auf 47 kalibriert (Register-Kalibrierung 2026-08-02).

Eigentümerschaft

zif-terminalOrganisation
0 Follower2 öffentliche Reposseit Dez. 2025

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
Gogithub.com/zif-terminal/libv1.40.0-77vor 15 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

74Gut · 21 % des Gesamtindex
Wie die Bewertung erfolgt
28.8/36Push-Aktualität — letzter Push vor 15 Tagen
11.8/36Commit-Rhythmus — 17/52 Wochen mit Commits
18/18Commit-Volumen — 196 Commits im letzten Jahr
6/10OpenSSF Scorecard: Maintained — 8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6
Verwendete Eingangsdaten
commits_last_year196
human_commit_share1
days_since_last_push15
active_weeks_last_year17
Wie die Bewertung erfolgt
16.2/27Liefert Releases aus — 79 Versions-Tags (keine GitHub-Releases)
36/36Release-Aktualität — letztes Release vor 15 Tagen
27/27Release-Rhythmus — ein Release etwa alle 14 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count79
latest_release_tagv1.40.0
releases_from_tagsja
days_since_latest_release15
mean_days_between_releases14
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

12Kritisch · 17 % des Gesamtindex
Wie die Bewertung erfolgt
0/60Stars — 0 Stars
0/25Forks — 0 Forks
0/15Watcher — 0 Watcher
Verwendete Eingangsdaten
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
0/22.5Lizenz — keine Lizenzdatei erkannt
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licensenein
readme_badges3
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
readme_badge_servicesgithub.com, shields.io
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

53Mittel · 23 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0.2/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 99 % der Commits
2.7/13.5Breite der Beitragenden — 2 Beitragende
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Verwendete Eingangsdaten
bus_factor1
contributors_sampled2
top_contributor_share0,99
Wie die Bewertung erfolgt
42/42Issue-Lösungsquote — 100 % der Issues geschlossen
28.4/30PR-Annahme — 72/76 entschiedene PRs gemergt
0/13Newcomer PR acceptance — kein PR eines Erstbeitragenden in 30 Tagen entschieden
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
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
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): newcomer_pr_acceptance. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
0/25Reichweite des Inhabers — 0 Follower von zif-terminal
4.8/25Kontohistorie — 2 öffentliche Repos, Kontoalter ca. 0 Jahre
Verwendete Eingangsdaten
followers0
owner_typeOrganization
is_verified
owner_loginzif-terminal
public_repos2
account_age_days249

Paketpflege

100Außergewöhnlich
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf go
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 15 Tagen
20/20Versionshistorie — 77 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesgithub.com/zif-terminal/lib
ecosystemsgo
any_deprecatednein
min_days_since_publish15

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

54Mittel · 19 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 1 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 5 out of 6 merged PRs checked by a CI test -- score normalized to 8
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein

Dokumentation

40Schwach
Wie die Bewertung erfolgt
30/30README
0/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
0/10Topics
0/10Wiki
Verwendete Eingangsdaten
topics
has_wikinein
homepage
has_readmeja
has_docs_dirnein
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

36Schwach · 16 % des Gesamtindex
Wie die Bewertung erfolgt
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.5Lizenz — 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 — keine Daten
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 — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,6
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Trägt ein bewusst kleines Gewicht (4 %): Agenten-Tooling ist ein echtes Pflegesignal, doch ein Repository ohne jedes Signal kann weiterhin 100/100 erreichen.

63Mittel · 4 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 99 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — go.mod (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 72 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesgo.sum
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0,72
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
53.9/55Handhabbare Dateigrößen — 2/100 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes153.902
source_files_sampled100
oversized_source_files2

Eckdaten

0GitHub-Sterne
2Mitwirkende
196Commits, letzte 12 Monate
15Tage seit letztem Push
79Releases
1Bus-Faktor
0offene Issues
GoPaket-Ökosysteme

Warnungen zur Datenerhebung

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

Weitere Details

OpenSSF Scorecard 3.6 / 10
3.6Gesamtwert

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).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
k. A.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
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Direkte Abhängigkeiten 3
RegistryPaketVersionsvorgabeManifest
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/machinebox/graphqlv0.2.2go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

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

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v2.5.0, Schema v0.31.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenGo.