Registro público
Informe de salud del softwareesquema 0.31.0 · métricas 2.5.0 · 2026-08-07 05:37 UTC

zif-terminal / lib

Share go module for zif

GoSin licencia detectada★ 0 estrellas⑂ 0 forksdesde dic 2025Ver en GitHub ↗
TipoBibliotecacómo se determina

zif-terminal/lib tiene un índice de salud de 47 sobre 100, lo que lo sitúa en la banda Débil. Su puntuación más alta es Vitality (74/100) y la más baja, Community & Adoption (12/100). Se actualizó por última vez hace 15 días. Una sola persona concentra la mayor parte del trabajo reciente.

47
global / 100
Débil

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala estandarizada de 1 a 100. El resultado global parte de su media ponderada, calibrada contra la distribución del registro público para que las bandas tengan significado percentil; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe un límite «En riesgo» de 34.

47
Excepcional93-100El nivel más alto del registro (≈ el 5% superior); cumple prácticamente todos los criterios evaluados
Excelente80-92Sólido en todos los frentes; carencias menores
Bueno65-79Saludable; carencias limitadas y manejables
Moderado50-64Aceptable con carencias notables; se recomienda revisión
Débil35-49Debilidades sustanciales en varias áreas
En riesgo20-34Debilidades significativas; su adopción exige cautela
Crítico1-19Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

El resultado global ponderado 48 se calibra a 47 en la escala publicada del índice (calibración del registro 2026-08-02).

Titularidad

zif-terminalOrganización
0 seguidores2 repositorios públicosdesde dic 2025

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/zif-terminal/libv1.40.0-77hace 15 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

74Bueno · 21% del índice global
Cómo se puntúa
28.8/36Recencia de push — último push hace 15 días
11.8/36Cadencia de commits — 17/52 semanas con commits
18/18Volumen de commits — 196 commits en el último año
6/10OpenSSF Scorecard: Maintained — 8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6
Datos de entrada utilizados
commits_last_year196
human_commit_share1
days_since_last_push15
active_weeks_last_year17
Cómo se puntúa
16.2/27Publica versiones — 79 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 15 días
27/27Cadencia de publicación — una versión cada ~14 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count79
latest_release_tagv1.40.0
releases_from_tags
days_since_latest_release15
mean_days_between_releases14
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

12Crítico · 17% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
0/22.5Licencia — no se detectó ningún archivo de licencia
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_licenseno
readme_badges3
has_contributingno
has_issue_templateno
has_code_of_conductno
readme_badge_servicesgithub.com, shields.io
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

53Moderado · 23% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.2/22.5Distribución de commits — el principal contribuyente firma el 99% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,99
Cómo se puntúa
42/42Resolución de issues — 100% de issues cerradas
28.4/30Aceptación de PR — 72/76 PR decididos fusionados
0/13Newcomer PR acceptance — ningún PR de un contribuyente primerizo decidido en 30 d
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
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
Excluidos de la puntuación (sin datos o no aplicable): newcomer_pr_acceptance. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
0/25Alcance del propietario — 0 seguidores de zif-terminal
4.8/25Trayectoria — 2 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers0
owner_typeOrganization
is_verified
owner_loginzif-terminal
public_repos2
account_age_days249
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 15 días
20/20Historial de versiones — 77 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/zif-terminal/lib
ecosystemsgo
any_deprecatedno
min_days_since_publish15

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

54Moderado · 19% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 1 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
16/20OpenSSF Scorecard: CI-Tests — 5 out of 6 merged PRs checked by a CI test -- score normalized to 8
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
homepage
has_readme
has_docs_dirno
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

36Débil · 16% del índice global
Cómo se puntúa
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.5Licencia — 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 — sin datos
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 — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,6
Excluidos de la puntuación (sin datos o no aplicable): packaging, signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Tiene un peso deliberadamente pequeño (4%): las herramientas para agentes son una señal real de mantenimiento, pero un repositorio sin ninguna puede alcanzar igualmente 100/100.

63Moderado · 4% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 99 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,99
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
12.6/18Arranque con un solo comando — go.mod (convención del toolchain, sin ejecutor de tareas)
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 72 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,72
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
53.9/55Tamaños de archivo manejables — 2/100 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes153.902
source_files_sampled100
oversized_source_files2

Datos clave

0estrellas de GitHub
2contribuidores
196commits en los últimos 12 meses
15días desde el último push
79versiones publicadas
1factor bus
0issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

OpenSSF Scorecard 3.6 / 10
3.6agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).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
n/dPackagingpackaging 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
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 3
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/machinebox/graphqlv0.2.2go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "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
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v2.5.0, esquema v0.31.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasGo.