Registro público
Informe de salud del softwareesquema 0.26.0 · métricas 1.13.0 · 2026-07-22 10:50 UTC

Tannex / cq

My personal mainframe toolbox

GoMIT★ 0 estrellas⑂ 0 forksdesde jul 2026Ver en GitHub ↗

Tannex/cq tiene un índice de salud de 56 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (71/100) y la más baja, Community & Adoption (24/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

56
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

56
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas 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.

Titularidad

Henrik Sejer PedersenCuenta personal
0 seguidores8 repositorios públicosdesde ago 2013@Bankdata

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/Tannex/cqv0.2.0-2hace 0 días

Métricas por categoría

Vitalidad

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

69Moderado · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
1.4/36Cadencia de commits — 2/52 semanas con commits
18/18Volumen de commits — 180 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year180
human_commit_share0,98
days_since_last_push0
active_weeks_last_year2
Cómo se puntúa
27/27Publica versiones — 2 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~4 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count2
latest_release_tagv0.2.0
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases4

Comunidad y Adopción

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

24Crítico · 18% 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
22.5/22.5Licencia — licencia reconocida (MIT)
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_license
has_contributingno
has_issue_templateno
has_code_of_conductno
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?

54Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.5/22.5Distribución de commits — el principal contribuyente firma el 98% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,978
Cómo se puntúa
46.8/46.8Resolución de issues — 100% de issues cerradas
35.9/38.3Aceptación de PR — 45/48 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/13 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs45
open_issues0
closed_issues20
issue_closed_ratio1
closed_unmerged_prs3
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
0/25Alcance del propietario — 0 seguidores de Tannex
18.9/25Trayectoria — 8 repos públicos, cuenta de ~12 años
Datos de entrada utilizados
followers0
owner_typeUser
is_verified
owner_loginTannex
public_repos8
account_age_days4720
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 0 días
12/20Historial de versiones — 2 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/Tannex/cq
ecosystemsgo
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

71Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 3 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 14 out of 14 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 5 topics
0/10Wiki
Datos de entrada utilizados
topicscli, mainframe, querying, tui, zosmf
has_wikino
homepage
has_readme
has_docs_dir
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?

57Moderado · 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.5/2.5CI-Tests — 14 out of 14 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/13 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
7.5/7.5Dependency-Update-Tool — update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
5/5SAST — SAST tool is run on all commits
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
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_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,6
Excluidos de la puntuación (sin datos o no aplicable): packaging. Los pesos restantes se han renormalizado.
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories0
affected_packages0
assessed_packages25
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos, Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejaron 25 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

66Moderado · 0% 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 — 82 de 98 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,837
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 — 46 de los últimos 100 commits con autoría o crédito de agente
8/8Mantenimiento automatizado — 2 de los últimos 100 commits son 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,46
toolchain_manifestsgo.mod
dependency_bot_commit_share0,02
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
54.4/55Tamaños de archivo manejables — 1/90 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes75.901
source_files_sampled90
oversized_source_files1

Datos clave

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

Más detalle

OpenSSF Scorecard 4.6 / 10
4.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-07-22 10:49 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests14 out of 14 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/13 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
10Dependency-Update-Toolupdate tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
n/dPackagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
10SASTSAST tool is run on all commits
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 9
RegistroPaqueteRestricción de versiónManifiesto
Gocharm.land/bubbles/v2v2.1.1go.mod
Gocharm.land/bubbletea/v2v2.0.8go.mod
Gocharm.land/lipgloss/v2v2.0.5go.mod
Gogithub.com/charmbracelet/x/ansiv0.11.7go.mod
Gogithub.com/danieljoos/wincredv1.2.3go.mod
Gogithub.com/godbus/dbus/v5v5.2.2go.mod
Gogithub.com/itchyny/gojqv0.12.19go.mod
Gogithub.com/zalando/go-keyringv0.2.8go.mod
Gogolang.org/x/textv0.40.0go.mod
Todas las dependencias 25

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 9 paquetes directos y 16 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
Gocharm.land/bubbles/v2v2.1.1directa
Gocharm.land/bubbletea/v2v2.0.8directa
Gocharm.land/lipgloss/v2v2.0.5directa
Gogithub.com/charmbracelet/x/ansiv0.11.7directa
Gogithub.com/danieljoos/wincredv1.2.3directa
Gogithub.com/godbus/dbus/v5v5.2.2directa
Gogithub.com/itchyny/gojqv0.12.19directa
Gogithub.com/zalando/go-keyringv0.2.8directa
Gogolang.org/x/textv0.40.0directa
Gogithub.com/atotto/clipboardv0.1.4indirecta
Gogithub.com/charmbracelet/colorprofilev0.4.3indirecta
Gogithub.com/charmbracelet/ultravioletv0.0.0-20260703014108-f5a850f9c2b7indirecta
Gogithub.com/charmbracelet/x/termv0.2.2indirecta
Gogithub.com/charmbracelet/x/termiosv0.1.1indirecta
Gogithub.com/charmbracelet/x/windowsv0.2.2indirecta
Gogithub.com/clipperhouse/displaywidthv0.11.0indirecta
Gogithub.com/clipperhouse/uax29/v2v2.7.0indirecta
Gogithub.com/itchyny/timefmt-gov0.1.8indirecta
Gogithub.com/lucasb-eyer/go-colorfulv1.4.0indirecta
Gogithub.com/mattn/go-runewidthv0.0.24indirecta
Gogithub.com/muesli/cancelreaderv0.2.2indirecta
Gogithub.com/rivo/unisegv0.4.7indirecta
Gogithub.com/xo/terminfov0.0.0-20220910002029-abceb7e1c41eindirecta
Gogolang.org/x/syncv0.22.0indirecta
Gogolang.org/x/sysv0.46.0indirecta
Avisos de dependencias 0

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 25 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 0 tienen avisos conocidos, de los cuales 0 son directas.

Ningún aviso conocido afecta a las dependencias evaluadas.

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [
        "cli",
        "mainframe",
        "querying",
        "tui",
        "zosmf"
      ],
      "is_fork": false,
      "size_kb": 3097,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Go": 964141,
        "Shell": 3893
      },
      "pushed_at": "2026-07-21T20:17:54Z",
      "created_at": "2026-07-13T16:03:41Z",
      "owner_type": "User",
      "updated_at": "2026-07-21T19:11:09Z",
      "description": "My personal mainframe toolbox",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Henrik Sejer Pedersen",
      "type": "User",
      "login": "Tannex",
      "company": "@Bankdata",
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/5255948?v=4",
      "created_at": "2013-08-18T16:22:54Z",
      "is_verified": null,
      "public_repos": 8,
      "account_age_days": 4720
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-21T18:59:13Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-07-17T19:37:59Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "286be7f9afb8a6f02064426614e7ad56f97a949a",
          "body": "Dispatch the WinGet workflow from the release build",
          "is_bot": false,
          "headline": "Merge pull request #71 from Tannex/winget-dispatch",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-21T19:08:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6081ab5e6bfba243cc6b9744d5ed35bcc7b09798",
          "body": "Releases published with GITHUB_TOKEN do not emit a release event, so\nwinget.yml never triggered automatically. Dispatch it explicitly after\npublishing the release.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Dispatch the WinGet workflow from the release build",
          "author_name": "Tannex",
          "author_login": "Tannex",
          "committed_at": "2026-07-21T19:04:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0a8da2f03df3b56fd7556aa893d74665e884e347",
          "body": "Publish releases to WinGet",
          "is_bot": false,
          "headline": "Merge pull request #70 from Tannex/winget-release",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-21T19:01:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d7ab35c68fed30b0acdca9d4a9ce7699a5366df8",
          "body": "Add a winget.yml workflow that submits Tannex.cq and Tannex.compaz\nmanifest updates via wingetcreate on every stable release. Flatten the\nWindows release zips (binary at archive root) so the WinGet nested\ninstaller path is stable across versions, document winget install in\nthe README, and add .gitattributes to normalize line endings.",
          "is_bot": false,
          "headline": "Publish releases to WinGet",
          "author_name": "Tannex",
          "author_login": "Tannex",
          "committed_at": "2026-07-21T18:53:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a31519c78b859e7b6747d2a325095717fcba5ec0",
          "body": "Add a read-only jobs view to Compa/z",
          "is_bot": false,
          "headline": "Merge pull request #66 from Tannex/jobs-view",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-21T11:51:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "47c3815f1d11002d6ee63de33f59fc12a906b60b",
          "body": "Jobs are ephemeral (a new run gets a new JOBID and vanishes from the\nqueue), unlike data set names, so a job \"favorite\" bookmarks the\ncurrent owner/prefix filter rather than starring an individual row.\nf on the jobs screen toggles a bookmark for the current filter; F\nopens the same favorites popup, \n[…]\nere's\nnothing sensible to type beyond the filter already showing on\nscreen), so add/edit/open degrade to a status hint or alias to jump\nfor that kind, and the popup footer reflects the smaller keyset.",
          "is_bot": false,
          "headline": "Add favorites support to the jobs view",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T20:18:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d89cb9ef714d027a23826686afb3463f9d2de7d6",
          "body": "The jobs screen's search line already displayed OWNER and PREFIX side\nby side, implying both were editable, but only prefix actually was\n(owner was fixed to the session user). Add a second search-line field\n(jobOwnerInput) and reuse the existing dialog-form Tab/Shift+Tab\nfield-cycling convention (Ne\n[…]\n at 8 characters (z/OSMF job owner IDs,\nlike real TSO userids, are capped at 8) so the \"sandbox\" profile's\n10-character fake username doesn't silently get truncated by the new\nowner field's CharLimit.",
          "is_bot": false,
          "headline": "Make the jobs owner filter editable, not just the prefix",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T19:34:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ddfe2c977b9435253609214533911430964bbf15",
          "body": "- Spool file list truncation (to make room for the synthetic JCL\n  entry) could silently drop real spool files with no visible signal,\n  since MoreRows is always false for this unpaginated screen; now\n  warns when truncation actually discards data.\n- openJobs() claimed \"this session cannot browse jo\n[…]\n handler; centralized the synthetic-JCL `ID < 0`\n  sentinel behind one predicate; reused invalidBrowseName's\n  control-character scan instead of a second copy.\n\nFound via /code-review --fix on PR #66.",
          "is_bot": false,
          "headline": "Fix bugs found in code review of the jobs view",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T18:52:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "666b3e62c959d4338428aadc9af24288bd31179e",
          "body": "List jobs, drill into a job's spool files (including the submitted JCL,\nsynthesized client-side since z/OSMF never lists it), and read spool\ncontent — all from a new J key on the data set screen, sharing the\nsession and every existing convention (generation-gated bounded\nfetches, pager, key routing,\n[…]\n\nthe next request's Start), so the naive reuse of forwardRecordPlan\nwould re-fetch and dedupe away the last cached line on every forward\npage.\n\nNot yet supported: submit, cancel, purge, hold, release.",
          "is_bot": false,
          "headline": "Add a read-only jobs view to Compa/z",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T18:12:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bd4aeeac0c95082399d570b8e5e1dac09009076c",
          "body": "…checkout-7\n\nBump actions/checkout from 6 to 7",
          "is_bot": false,
          "headline": "Merge pull request #50 from Tannex/dependabot/github_actions/actions/…",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T15:28:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "36f90c5495e969ef26b4c888c5909ca315484661",
          "body": "Overhaul README: cut prose, keep it reference-only",
          "is_bot": false,
          "headline": "Merge pull request #65 from Tannex/readme-overhaul",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T15:28:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e7a2015c3d92cb7885e8cc779f0a8d486aba0e8",
          "body": "Trims internals essays (request-cache mechanics, lenient-decoder\nbullet lists, edit-mode walkthrough) down to one or two actionable\nsentences each, drops the Compa/z keymap table (discoverable via ? in\nthe app) and the long-past cqt->compaz rename notice, and thins the\nZowe env-var enumeration and e\n[…]\n, cb2xml license attribution, and the\nrelease process. 498 -> 186 lines.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Overhaul README: cut prose, keep it reference-only",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T09:49:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c99fd8a99d61848bdff59b6abc2a3cfdd8e87d50",
          "body": "Key favorites by z/OSMF profile",
          "is_bot": false,
          "headline": "Merge pull request #64 from Tannex/favorites-per-profile",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:54:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3340b81cf8f63d2cb34e9a4d7f9da3e87d46d7b3",
          "body": "Favorites were one global namespace, so a DSN favorited on one system\nshowed up on every other profile's listing. Each favorite now carries\nthe profile it was saved under, every store operation scopes to the\nactive profile's view, and the same pattern can exist independently\nper profile. The empty p\n[…]\npgrade — legacy entries stay\nvisible (and removable) from every profile.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Key favorites by z/OSMF profile",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:54:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "595a5be293f8297ab3c2b5537942c3139b7e0ea8",
          "body": "Route bracketed-paste text to the focused input",
          "is_bot": false,
          "headline": "Merge pull request #63 from Tannex/paste-support",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:49:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3ad3579e0c03d02d25d24ccf007d55292e7b5b0",
          "body": "The terminal delivers pasted text as a single tea.PasteMsg, but Update\nonly routed KeyPressMsg, so pastes were silently discarded before any\nwidget saw them — no input in the app could be pasted into. handlePaste\nnow mirrors handleKey's precedence (editor, favorites inputs, query\nconsole, mapping fo\n[…]\n keyboard; the textinput/textarea widgets\nalready knew how to insert it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Route bracketed-paste text to the focused input",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:48:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ed7bd169d1a2ab52ec87c065731038f38cc81e96",
          "body": "Favorites: o opens an exact favorite directly",
          "is_bot": false,
          "headline": "Merge pull request #61 from Tannex/favorites-open-direct",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:25:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "07ca97265b9024bd1b54f6bb4d97d6b4d161e8b1",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into favorites-open-direct",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:24:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b536444ad0d5fed8ea8bc1443ef210bb1bf91e90",
          "body": "Favorites: add and edit pattern favorites, including regexes",
          "is_bot": false,
          "headline": "Merge pull request #60 from Tannex/favorites-pattern-editor",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:24:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e01c1170077689c3ea5bb3a66417de45f901ff1f",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into favorites-pattern-editor",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:23:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45fa9b05ac0a466d9948839edd96c0d1da1ec26e",
          "body": "Record data set opens and executed queries in a local JSONL log",
          "is_bot": false,
          "headline": "Merge pull request #59 from Tannex/usage-events",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:23:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0b391f2c05fb2efa9f146ca1c20b101db34b1e9",
          "body": "# Conflicts:\n#\tinternal/compaz/query.go",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into usage-events",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:23:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f1a17116edadbb10f522dc03916e4aeb5c9512c8",
          "body": "Adapt the query-copy test to whole-array evaluation",
          "is_bot": false,
          "headline": "Merge pull request #62 from Tannex/fix-query-copy-test",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:21:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a273cf3cbf842522e089a70550e77b5982a0fe95",
          "body": "The bulk engine evaluates the data set as one array, so the per-record\n.NAME expression the test ran produced zero results and nothing to\ncopy; .[].NAME yields the two expected lines. Fixes the suite breakage\nthe #55 merge introduced.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Adapt the query-copy test to whole-array evaluation",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:20:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "67556bc1a028688fe2d24409a498e43f4fd7fb74",
          "body": "Query console: completion pop-over, example placeholders, result copy",
          "is_bot": false,
          "headline": "Merge pull request #55 from Tannex/query-console-features",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:18:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c9cc0c089df7bd333d91b97e6ed6d7915aaf50db",
          "body": "# Conflicts:\n#\tinternal/compaz/query.go",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into query-console-features",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:17:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cc1dd6dad2af8132896866ccc3b1e3579ab34b2",
          "body": "Pin the terminal default colors to the ayu palette",
          "is_bot": false,
          "headline": "Merge pull request #54 from Tannex/paint-explicit-backgrounds",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:16:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b86717b72641f11895a094142d848be7096d7b6a",
          "body": "…ounds",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into paint-explicit-backgr…",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:16:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "58d97ffbaf949c7f98db33a9ce003f702da43086",
          "body": "Remove status texts that restate what the screen already shows",
          "is_bot": false,
          "headline": "Merge pull request #53 from Tannex/remove-wordy-status-texts",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:15:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "210f66c897975d4614315a82682ca84a3202bf6d",
          "body": "…exts\n\n# Conflicts:\n#\tinternal/compaz/query.go",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into remove-wordy-status-t…",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:15:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e983920a54c0524a899aa4fd886c1cfc8d59a38d",
          "body": "Move the profile switcher into the status line",
          "is_bot": false,
          "headline": "Merge pull request #52 from Tannex/profile-tabs-in-status-line",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:13:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46353c813a130067e0be4795c44eed2f3cdf3e1d",
          "body": "…s-line",
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main' into profile-tabs-in-statu…",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:12:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a69dc0d5fe27512592feef1daa11be012a9aa716",
          "body": "Restart the spinner tick loop when switching to a recalling workspace",
          "is_bot": false,
          "headline": "Merge pull request #51 from Tannex/fix-recall-spinner-freeze",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T06:12:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "841aa62d836d1d6d0984a4e9202af85d1ce02c3a",
          "body": "The queue was consumed by whichever data set listing next passed\nacceptBrowse: a prefix change, refresh, or back-navigation issued\nbetween pressing o and the listing landing could fire the stale open\nagainst an unrelated listing (or emit a spurious not-found warning),\nand a zero-budget jump armed th\n[…]\nrofile\nselects the favorite's row instead of dropping the open silently.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Bind the favorites auto-open queue to the fetch that armed it",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:48:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8fa7abedd555b472fefe5493d06cb8cebe3ccb66",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'favorites-pattern-editor' into favorites-open-direct",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:42:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb369b50c31011b577cdd9b60562b113282db9c4",
          "body": "selectedLineIndex ignored the add-pattern input line prepended to the\npopup content, so long scrolled lists rendered one row off while the\ninput was open. The store's three identical sort closures and two\nduplicate-existence scans collapse into sortByPattern and has.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Keep the favorites scroll aligned while adding; dedupe store helpers",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:42:38Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "137bd708ece4c7a7933605dd91810df8471091c7",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'usage-events' into favorites-pattern-editor",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:38:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1af0bf1060f96a23b8980fc5e70de4bf50ff2bf",
          "body": "Member opens inside a PDS were invisible to the usage log even though\nthey are the most specific thing the user reaches for; they now record\nas DSN(MEMBER). Submitting an invalid expression while a search was\nrunning left the old search mutating results behind the error banner;\nboth compile-error pa\n[…]\ne,\nand recordOpen's comment states the navigation-not-outcome semantics.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Record member opens, stop superseded searches, harden the event log",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:38:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "767ce1380ec6d32ddfddd7f66c7579c3ab3b4e3c",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'query-console-features' into usage-events",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:34:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f6392c1b73b350eb131d6dd04c8b66cdc86e6c8",
          "body": "The row budget allowed the box one row past the popup's bottom border\non 14-16 row terminals (the box spans rows+2 border lines from top+3,\nso rows cap at height-top-7, not -6). The anchor now clamps to the\ninput area so a horizontally scrolled expression cannot push the box\nto a column unrelated to\n[…]\n comes\nfrom lipgloss.Width instead of measuring the first rendered line.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Keep the completion pop-over inside the popup and anchor it sanely",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:33:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eadca6c49ddb07a65ab52ee584164f5067198387",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'paint-explicit-backgrounds' into query-console-features",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:29:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5ab5a8ec49913b4e55e7095176707b0752546290",
          "body": "The palette and View comments claimed unstyled fills match the data\narea by construction; that holds only on terminals honoring OSC 10/11,\nso the comments now say what happens elsewhere and on exit. The\ntui-shot garish-defaults note is re-scoped to what the check verifies\nsince the pin: a regression of the pinning itself, not per-cell\nstyling gaps.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Document what the color pinning does and does not guarantee",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:29:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "54d74308c760abb949f62291157367518e35b092",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'remove-wordy-status-texts' into paint-explicit-backgrounds",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:23:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4feca5a23bf7203b6b1eede7229a8825027e8e8e",
          "body": "minWidthForPosition guarded room for the removed row/record position\ntext; it now gates the profile-strip attempt, so it is named\nminWidthForStrip. queryFooter's doc example gains the minimal done\nstate so the comment matches both formats.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Rename the stale position-width constant and refresh the footer doc",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:23:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "16826e0c1e0adf308cb1c78b5cb2f7c0f5b2ed08",
          "body": "…exts\n\n# Conflicts:\n#\tinternal/compaz/view.go",
          "is_bot": false,
          "headline": "Merge branch 'profile-tabs-in-status-line' into remove-wordy-status-t…",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:18:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b411267f4510d8e4680481927602a9937b7b196",
          "body": "The profile strip rendered every profile unbounded, and statusLine\ndropped the whole right side when it did not fit — with the title chip\nalso suppressed in multi-profile mode, realistic profile sets on a\n52-80 column terminal lost every indication of the active profile.\nprofileStrip now takes a wid\n[…]\n tab\nbar; a stale tab-bar comment in the demo profile loader is updated.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Keep the active profile visible when the status line runs out of width",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:18:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "347536a4862c252b1a0ea7788c66a96dc247200d",
          "body": "commandYieldsSpinnerTick was the sixth verbatim copy of the\ntea.Cmd/tea.BatchMsg drain loop in the test files. executeCommand and\nthe new helper now share walkMessages, a breadth-first traversal with a\nvisit callback; the remaining copies can migrate as their files are\ntouched.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Share one command-drain traversal between test helpers",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T04:10:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "767dfc02fcb66cb70ab674d8745b0f1165c7e693",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'favorites-pattern-editor' into favorites-open-direct",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T03:55:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb71ea29f75f33738b025830fda20cebc5cd8903",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'usage-events' into favorites-pattern-editor",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T03:55:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5f60020c9123e6db8cb22cd17500313da32d4ff5",
          "body": "A scanner error mid-file left read reporting ok with a truncated event\nslice; compaction would then rewrite events.jsonl from that slice and\npermanently drop the unread tail. A scan error now reports not-ok, so\ncompact leaves the file untouched.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Do not compact the event log from a partial read",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-20T03:55:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6bbcb65ff2bde9ed66cf72c41d67a7fdef5a04ad",
          "body": "Applying a favorite only set it as the prefix filter, costing an extra\nkeypress for the common case of jumping into one data set. The popup's\no action runs the same jump fetch with the data set queued for\nauto-open: when the listing lands, the row is selected and the normal\nopenSelection path runs, \n[…]\n nothing unambiguous to open and degrade to the filter jump.\n\nCloses #57\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Favorites: o opens an exact favorite directly",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T21:57:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d5bbbd91aacb14dcd20c8610abdac650e83ba34",
          "body": "Favorites could only be toggled from the selected data set, so a\nfavorite always started as an exact DSN even though the store and\nmatcher already understood wildcard and /regex/ patterns. The popup\nnow has an add input (a) for new patterns and an edit input (e) that\nrenames the selected favorite in\n[…]\nand\ntimestamps, duplicates and invalid regexes are rejected.\n\nCloses #56\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Favorites: add and edit pattern favorites, including regexes",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T21:53:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2334f3908ba022f2fe6454132a6cbe87ffc4d04a",
          "body": "Groundwork for the suggestion engine and query history: a new\ninternal/events store appends one JSON line per event — data set opens\nand executed jq expressions with their compile outcome — to\ncq/events.jsonl. Appends are single O_APPEND writes, durable\nimmediately and safe when several instances in\n[…]\n events store the expression text as typed and nothing else.\n\nCloses #58\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Record data set opens and executed queries in a local JSONL log",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T21:49:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e5df2a746290fa8e7b641870feb1ab86fb2c98e4",
          "body": "Three query console features:\n\n- The ctrl+space field list renders as its own compositor layer anchored\n  under the token being completed, overlapping the results pane instead\n  of splicing rows into the popup body (the tiny-terminal panel keeps\n  the inline form since it has no compositor).\n- The i\n[…]\nom typing C into the expression input.\n\nCloses #44\nCloses #42\nCloses #43\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Query console: completion pop-over, example placeholders, result copy",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T20:59:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "05db5d47c2a417dcc8ae3252d7dd2d6c4c83f668",
          "body": "Chrome rows disagreed about painting and many regions rendered on the\nterminal default, so any host theme other than ayu's bled through as\ninconsistent banding (see the garish-defaults tui-shot captures). Rather\nthan chasing an explicit background onto every cell, the view now pins\nthe terminal's de\n[…]\n; it now matches the data area on every terminal.\n\nCloses #47\nCloses #41\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Pin the terminal default colors to the ayu palette",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T20:51:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "663c48ce2868e4df4c176a73e0201d2119f6873d",
          "body": "The status line is now reserved for transient state with no other home:\nloading, errors, empty results, end-of-data markers. Deleted outright:\ndecode summaries, ready-state row counts, the row/record position\nindicator (the gutter already numbers records), and the query footer's\nmode narration. star\n[…]\ntion text was the only thing resetting the level afterwards.\n\nCloses #46\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Remove status texts that restate what the screen already shows",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T20:47:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ac90a01d66f81943bf602ca40ea0570593ef50bb",
          "body": "The profile tab strip spent a full terminal row on information that\nrarely changes, and its extra chrome row made every layout computation\nconditional on the profile count — the source of the multi-profile\noff-by-one where the help line was pushed off-screen and the row budget\nwas derived from a tab\n[…]\n- and single-profile sessions share one geometry.\n\nCloses #45\nCloses #38\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Move the profile switcher into the status line",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T20:35:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e2d4d5926a2553a0fad503a60cd8831d1aee1a18",
          "body": "The tick loop only stays alive while the active workspace is loading or\nhas pending recalls, so switching away and back froze the animated\nRECALL indicator on one frame. Batch a spinner tick from switchProfile\nwhen the incoming workspace has recalls in flight.\n\nFixes #40\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01CS2LZMn2YJdebAiry2jzdP",
          "is_bot": false,
          "headline": "Restart the spinner tick loop when switching to a recalling workspace",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T20:28:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9c4c60575294a252d12879a69e7594dec7ae7297",
          "body": "Bumps [actions/checkout](https://github.com/actions/checkout) from 6 to 7.\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/v6...v7)\n\n---\nupdated-dependenc\n[…]\n:\n- dependency-name: actions/checkout\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump actions/checkout from 6 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-19T20:21:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "54a16ed0339a917ff3874daa57c91b543a2ea04b",
          "body": "…setup-go-7\n\nBump actions/setup-go from 6 to 7",
          "is_bot": false,
          "headline": "Merge pull request #49 from Tannex/dependabot/github_actions/actions/…",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T20:19:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "151e595e5a24d79b17b9a15243758fcb472326db",
          "body": "Bumps [actions/setup-go](https://github.com/actions/setup-go) from 6 to 7.\n- [Release notes](https://github.com/actions/setup-go/releases)\n- [Commits](https://github.com/actions/setup-go/compare/v6...v7)\n\n---\nupdated-dependencies:\n- dependency-name: actions/setup-go\n  dependency-version: '7'\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] <support@github.com>",
          "is_bot": true,
          "headline": "Bump actions/setup-go from 6 to 7",
          "author_name": "dependabot[bot]",
          "author_login": "dependabot[bot]",
          "committed_at": "2026-07-19T20:11:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08c3b2d9c588e20b34b53c9a7a03df7c7c59475c",
          "body": "Add Dependabot config for Go modules and GitHub Actions",
          "is_bot": false,
          "headline": "Merge pull request #48 from Tannex/dependabot-setup",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T20:10:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "35b821dfc40801e5fc05a2c5eac6651972797da1",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add Dependabot config for Go modules and GitHub Actions",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T20:05:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1a2b2241cec2213b25d3a06f4dfef634191e5595",
          "body": "Evaluate jq queries over the whole data set, downloaded once",
          "is_bot": false,
          "headline": "Merge pull request #37 from Tannex/query-bulk-download",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T20:04:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "56f340566c38cf5583c2cf9392454a0167c520c3",
          "body": "Fix data race in the dsncopy test fetcher",
          "is_bot": false,
          "headline": "Merge pull request #36 from Tannex/audit-race-fix",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T20:03:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7b880b54623c9149ba5900bf81639ee830b28a0a",
          "body": "A query now always evaluates the whole data set as one JSON array (jq\nslurp semantics): the records are downloaded in a single record-mode\nrequest — reusing the cached file while the same records are browsed —\nand the expression runs once over the decoded array. This removes the\nper-record streaming\n[…]\n\nThe demo browser implements OpenRecords so --demo queries keep working.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01MXpH8aBi2x9SitjncZ5U5E",
          "is_bot": false,
          "headline": "Simplify the query console to array-only evaluation from one download",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T19:23:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab7dbeb516b71481d261d1c6c2921e67e3872586",
          "body": "Closing the query console no longer deletes the downloaded file: it\nmoves to the workspace, keyed by record identity, so reopening the\nconsole or editing the query reuses it with no new host traffic. The\ncache drops when the browsed records change, on refresh, after a\nsuccessful edit save, and at quit — the moments the local copy could go\nstale.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Keep the bulk query download while the same records are browsed",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T17:42:17Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1e58a54cb598068dd4867b8be115b3ebd86d197a",
          "body": "A streaming search fetches bounded record pages, which can mean\nhundreds of round trips on a large data set. When paging has run longer\nthan ten seconds, the search now pulls every record in a single\nrecord-mode request (new zosmf.RecordStreamer capability, kept outside\nthe bounded Browser surface) \n[…]\n file too, a failed download falls back to paging, re-runs\nreuse the download, and the file is removed when the console closes or\nthe app quits.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Download the whole data set once when a jq search pages past ten seconds",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T17:24:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e2229176127a4490fe654110272317be772e6a5e",
          "body": "The resolver probes libraries concurrently, so mapFetcher.requests\nraced under go test -race.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Guard the test fetcher's request log against concurrent probes",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T16:58:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f81a3c369aa83d2ae2467c96f00717fd1dd0c627",
          "body": "Capture tui-shot PNGs on garish terminal defaults",
          "is_bot": false,
          "headline": "Merge pull request #35 from Tannex/tui-shot-offcolor",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T16:47:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2003d89e6dc2ed3e8029583bdbd5d1c3a0d8daec",
          "body": "Screenshots previously ran on ayu's exact editor background, which\nhid every spot where the app relied on the terminal default instead of\nstyling deliberately - the popup fill bug shipped invisible because of\nit. PNG captures now use a bright pink background and green foreground\nso unstyled cells ar\n[…]\nmpossible to miss in review. The script\ndocuments that this is intentional: findings are fixed in the\napplication, never by muting these colors.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Capture tui-shot PNGs on garish terminal defaults",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T16:45:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "25921784ed108a5bb43f106a443854ea61353e2f",
          "body": "Fall back to the COPY search chain when a copybook DSN is 404",
          "is_bot": false,
          "headline": "Merge pull request #34 from Tannex/copybook-search-fallback",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T16:34:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "541e7b4fb2b57971c4ee74ba1b130fc69e294edc",
          "body": "Polish jq popup: transparent, header-anchored, ctrl+space field completion",
          "is_bot": false,
          "headline": "Merge pull request #33 from Tannex/jq-popup-polish",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T16:31:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3db396603ccd8567e169c4435784b530cc8b55fc",
          "body": "A saved mapping or --copybook-dsn breaks when the copybook moves to a\ndifferent library. When z/OSMF reports the copybook missing (404) and\nthe name carries a member — DSN(MEMBER) or a bare member-sized name —\nthe member is now re-resolved through the same ordered dsnSearchPath\nchain nested COPY mem\n[…]\n already use, in both cq and Compa/z. Other\nerrors and names without a member keep the original failure, and a\nfailed chain reports both errors.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fall back to the COPY search chain when a copybook DSN is 404",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T16:29:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "28772a25791ec897c001afb615c2bb7ab382484e",
          "body": "The ayu port set the popup fill to the editor background so popups\nwould be distinguished by border and title alone — but the data area\nrenders on the terminal default, and the fill only disappears when the\nterminal happens to use ayu's exact background, which it almost never\ndoes. Painting nothing achieves the intended look on any terminal, for\nhelp, favorites, and the jq console alike.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop the popup background fill for every popup",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T15:40:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "727ccf988756a77a1d80c117914c6abca01f7716",
          "body": "The theme already blends the popup background into the editor\nbackground; terminal-default transparency was one step too far.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Keep the ayu popup fill for the jq popup",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T15:34:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2a49b7e9aa19de6da07a2d5986b6360456f2da3d",
          "body": "…etion\n\nThe query popup no longer paints a background fill: covered cells fall\nback to the terminal default so it reads like a floating sheet. It also\nanchors below the table header row instead of centering, keeping the\ncolumn names an expression refers to readable while typing (status and\nhelp line\n[…]\nents jq cannot take after a\nbare dot, so CUST-TYPE becomes .\"CUST-TYPE\" while NAME stays .NAME,\nincluding nested group paths segment by segment.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Polish jq popup: transparent, header-anchored, ctrl+space field compl…",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T15:22:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b517bf3dd2164b5f49162ed91dab485435f565bc",
          "body": "Add R hotkey to recall migrated data sets with live indicator",
          "is_bot": false,
          "headline": "Merge pull request #32 from Tannex/migrated-dataset-recall",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T15:13:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b388ed1ea396c1bc49922c86ebdcf4639323d24",
          "body": "Adopt the Ayu Dark color scheme",
          "is_bot": false,
          "headline": "Merge pull request #31 from Tannex/ayu-theme",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T15:13:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2ff80137e7ccc555f9bace431aa10829a5e32bd",
          "body": "A wildcard-free prefix is now an exact catalog lookup, which is what the\nrecall watcher needs, and prefix searches require the user to spell out\n* or % themselves. This removes the ExactName request flag added for the\nwatcher and the append special case.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop the implicit dslevel wildcard; prefixes are sent as typed",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T14:52:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ff49fed9ea1a3a44c46d78e8458485a7f0f4e978",
          "body": "The watcher listed the catalog with the exact DSN as a prefix, and the\nclient force-appends a wildcard to wildcard-free prefixes. For names\nwith an eight-character last qualifier (or 44 characters total) that\nproduced an invalid dslevel, so every check failed silently and the\nwatch warned after the \n[…]\n an hour for tape recalls, and\nany data set browse result resolves pending recall indicators so a\nmanual refresh finishes the watch on the spot.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix recall watch missing completed recalls; extend and harden the watch",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T14:42:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3fdf3aff91a539f4373787eb1839b26e86371952",
          "body": "Pressing R on a migrated data set submits an HRECALL through z/OSMF and\nmarks the row with an animated RECALL indicator. Since z/OSMF reports no\nrecall progress, the catalog is polled every few seconds until the data\nset leaves migration storage, then the row refreshes in place with its\nnew volume. Opening a migrated data set now hints at the hotkey instead\nof failing.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add R hotkey to recall migrated data sets with live indicator",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T14:29:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3e106506545a55a55a96df9ad2a5f67f0e836302",
          "body": "Default tui-shot captures to 160x40",
          "is_bot": false,
          "headline": "Merge pull request #30 from Tannex/tui-shot-160x40",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:58:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1264d551b218845f5a20adf54614e7eb3440b2fb",
          "body": "Rebrand cqt to Compa/z (binary: compaz)",
          "is_bot": false,
          "headline": "Merge pull request #29 from Tannex/issue-22-compaz-rebrand",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:58:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "28f9adbcaed5afdb88c439522430788ceb4a5047",
          "body": "Heuristic JCL/COBOL detection and syntax highlighting in the raw record view",
          "is_bot": false,
          "headline": "Merge pull request #28 from Tannex/issue-21-syntax-highlighting",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:58:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19c12ea702348a767b904e6152c8ee0b41613b55",
          "body": "Polish table views: alignment, type-aware tints, and placeholders",
          "is_bot": false,
          "headline": "Merge pull request #27 from Tannex/issue-19-table-polish",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:56:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b633f44cf4b8fd4e6249965793c815b2b67ee51",
          "body": "Add jq query popup to the records view (lazy whole-file evaluation)",
          "is_bot": false,
          "headline": "Merge pull request #26 from Tannex/issue-18-jq-query-popup",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:52:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "10fd282915c990105f6ee6a5c82eb5c94b06e001",
          "body": "Add edit mode for data sets/members: e to edit, explicit save only (ctrl+s)",
          "is_bot": false,
          "headline": "Merge pull request #25 from Tannex/issue-17-edit-mode",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:52:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50cfe54aace36b637d3398f720ebf293d4d8f688",
          "body": "Review feedback: the elevated popup background bled outside the rounded\nborder glyphs, which don't fill their cells. Popups (help, favorites,\njq query) now keep the main background and are distinguished by border\nand title styling alone. Palette block and README credit the Ayu color\nscheme (MIT, ayu-theme/ayu-colors). Captures retaken, including the\nhelp popup.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Drop elevated popup fill and credit the Ayu theme",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:38:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d212eea5ac5cda96cf5f527542b418fa2408d00b",
          "body": "Replace the slate/teal palette with Ayu Dark (ayu-theme/ayu-colors),\nhardcoded as a named constant block so the TUI takes no dependency.\nAlpha-composited Ayu values (selection, status-chip fills) are\npre-blended onto the editor background because terminal cells cannot\nlayer translucent color. Stray \n[…]\n, and\ntui-shot's xterm colors now route through the palette, and style tests\nderive their SGR assertions from it instead of hardcoded fragments.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Adopt the Ayu Dark color scheme",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:35:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8cca0885dfd97697d62efd2cd44c3873825820b5",
          "body": "Pin the go install examples to release tags and call out that main is\nthe development version, per PR #29 review.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Recommend tagged installs over building from main",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:34:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e0ef6228bb3ffdde94b8637444d0a0b93da8b0ea",
          "body": "Rename cmd/cqt to cmd/compaz and internal/cqt to internal/compaz\n(package compaz), update all user-facing strings (window title,\nconsole titles, usage, version, error prefix) to the Compa/z wordmark\nor the compaz binary name, rename release artifacts to\ncompaz_VERSION_OS_ARCH, and update README, tui\n[…]\nshot examples, the\nverify skill, and .gitignore. The README carries a \"formerly cqt\"\ndeprecation callout; no shim binary is shipped.\n\nCloses #22\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Rebrand cqt to Compa/z (binary: compaz)",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:34:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ba96a8a504d57650e844ac62463cde00c1d17f22",
          "body": "Extract named helpers (isJCLPrefixed, containsCOBOLDivision,\ncontainsPICClause, blankOrDigits, takeQuoted, splitAtSpace, wordEnd) and\nCOBOL column constants so the scanning code reads without per-line\ncomments. No behavior change; existing syntax tests pass unmodified.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Refactor syntax.go so structure replaces narration",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:34:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5480a62a475d324f872ba0dfe5fd49e91f97a872",
          "body": "The raw record view now classifies decoded records once per loaded page\n(never per keystroke or render frame) as JCL, COBOL, or plain via cheap\nheuristics: JCL by the //-statement ratio, COBOL by scored signals\n(division headers, PIC clauses, column-7 comments, sequence areas) so\nflat data files wit\n[…]\nDemo mode serves a real JCL job from DEMO.JCLLIB and a COBOL program\nfrom DEMO.SOURCE.COBOL so every token class is visible offline.\n\nCloses #21\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Detect JCL and COBOL source and highlight it in the raw record view",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:34:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1981841940410265f9570a9e3e5ab62b63a3427c",
          "body": "Review feedback on the table polish: the three meta rows (tab bar,\ntitle, search/codepage) blended into the data area. A muted ─ rule now\nsits between them and the table on every main screen, echoing the\n│ gutter language. The rule costs one chrome row, so the fixed chrome\ncount grows to six and the geometry-derived tests shift one row.\nRefreshed the after-* captures (wide + narrow) to show it.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Separate chrome from data with a full-width rule line",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:34:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "44bbd58ece2b402b39b2f79d0318ac16f6caeb8b",
          "body": "Give the three table views contrast and hierarchy within the existing\nslate/teal palette, using pre-styled cell strings (ANSI-aware truncation\nkeeps them safe at any width):\n\n- Right-align numeric columns everywhere: LRECL in the dataset list,\n  VER/MOD/RECORDS in the member list, and zoned/packed/b\n[…]\nd text kinds so demo mode\nexercises every styled case. Before/after captures (wide + narrow) live\nin docs/screenshots/table-polish/.\n\nCloses #19\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Polish table views with alignment, tints, and placeholders",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:27:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d7a8c43cc7549f1528a203bbb0a3a90a96f17bcc",
          "body": "- Show the full \"last error\" and compile errors wrapped across their own\n  footer lines instead of truncating to one line.\n- Fall back to whole-dataset array mode when the streaming pass ends\n  with zero matches and only per-record errors: the expression is re-run\n  once over every decoded record co\n[…]\nond and always read 0:00 before.\n- Remove the ctrl+c force-quit from the query popup, matching the editor\n  binding cleanup on the branch below.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Address jq popup review: errors, array mode, quotes, alignment, clock",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:27:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "72a6c2955f6e33e3a823ce938282dd26d2ef3fad",
          "body": ": on the records screen opens a composited popup — expression input over\na scrollable results pane — that runs a jq query (via internal/query /\ngojq) over every record's decoded value. Evaluation is lazy: cached\nrecords stream results immediately, then the search keeps fetching\nforward pages through\n[…]\nnnot freeze the UI\n- queries need a copybook overlay; raw browsing gets an explanation\n- internal/query gains RunContext and Marshal\n\nCloses #18\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add jq query popup to the records view",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:22:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "603931b27a412229e262a2f779540296dc9ad6b8",
          "body": "- Decode text-mode payloads from ISO 8859-1 (the z/OSMF wire encoding)\n  into UTF-8 on fetch and encode back on save, so ÆØÅ round-trips in the\n  editor exactly as it renders in the browse view. LRECL validation now\n  measures encoded host bytes, not UTF-8 bytes, and unmappable runes are\n  rejected \n[…]\n\n- Remove the explicit ctrl+c quit binding inside the editor; esc (with\n  the dirty confirm) is the way out, quitting stays on the list screens.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Address edit-mode review: encoding, gutter, key-repeat inertia, ctrl+c",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T13:21:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "503edf2c0f9960836d0cfa5a407408dcd6f1958c",
          "body": "Persist DSN → copybook mappings (JSON state, wildcard patterns, dialog integration)",
          "is_bot": false,
          "headline": "Merge pull request #23 from Tannex/issue-15-dsn-copybook-mappings",
          "author_name": "Henrik Sejer Pedersen",
          "author_login": "Tannex",
          "committed_at": "2026-07-19T12:19:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 2,
      "commits_last_year": 180,
      "latest_release_at": "2026-07-21T18:59:13Z",
      "latest_release_tag": "v0.2.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 2,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/Tannex/cq",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/Tannex/cq",
          "is_deprecated": false,
          "latest_version": "v0.2.0",
          "repository_url": "https://github.com/Tannex/cq",
          "versions_count": 2,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-21T18:53:44Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "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
      },
      "open_issues_and_prs": 3
    },
    "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": 75901,
      "source_files_sampled": 90,
      "oversized_source_files": 1,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 25,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "charm.land/bubbles/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.1.1"
        },
        {
          "name": "charm.land/bubbletea/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.8"
        },
        {
          "name": "charm.land/lipgloss/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.0.5"
        },
        {
          "name": "github.com/charmbracelet/x/ansi",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.11.7"
        },
        {
          "name": "github.com/danieljoos/wincred",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.2.3"
        },
        {
          "name": "github.com/godbus/dbus/v5",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.2.2"
        },
        {
          "name": "github.com/itchyny/gojq",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.12.19"
        },
        {
          "name": "github.com/zalando/go-keyring",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.8"
        },
        {
          "name": "golang.org/x/text",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.40.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "charm.land/bubbles/v2",
            "direct": true,
            "version": "v2.1.1",
            "ecosystem": "go"
          },
          {
            "name": "charm.land/bubbletea/v2",
            "direct": true,
            "version": "v2.0.8",
            "ecosystem": "go"
          },
          {
            "name": "charm.land/lipgloss/v2",
            "direct": true,
            "version": "v2.0.5",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/ansi",
            "direct": true,
            "version": "v0.11.7",
            "ecosystem": "go"
          },
          {
            "name": "github.com/danieljoos/wincred",
            "direct": true,
            "version": "v1.2.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/godbus/dbus/v5",
            "direct": true,
            "version": "v5.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/itchyny/gojq",
            "direct": true,
            "version": "v0.12.19",
            "ecosystem": "go"
          },
          {
            "name": "github.com/zalando/go-keyring",
            "direct": true,
            "version": "v0.2.8",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/text",
            "direct": true,
            "version": "v0.40.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/atotto/clipboard",
            "direct": false,
            "version": "v0.1.4",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/colorprofile",
            "direct": false,
            "version": "v0.4.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/ultraviolet",
            "direct": false,
            "version": "v0.0.0-20260703014108-f5a850f9c2b7",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/term",
            "direct": false,
            "version": "v0.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/termios",
            "direct": false,
            "version": "v0.1.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/windows",
            "direct": false,
            "version": "v0.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/clipperhouse/displaywidth",
            "direct": false,
            "version": "v0.11.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/clipperhouse/uax29/v2",
            "direct": false,
            "version": "v2.7.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/itchyny/timefmt-go",
            "direct": false,
            "version": "v0.1.8",
            "ecosystem": "go"
          },
          {
            "name": "github.com/lucasb-eyer/go-colorful",
            "direct": false,
            "version": "v1.4.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-runewidth",
            "direct": false,
            "version": "v0.0.24",
            "ecosystem": "go"
          },
          {
            "name": "github.com/muesli/cancelreader",
            "direct": false,
            "version": "v0.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/rivo/uniseg",
            "direct": false,
            "version": "v0.4.7",
            "ecosystem": "go"
          },
          {
            "name": "github.com/xo/terminfo",
            "direct": false,
            "version": "v0.0.0-20220910002029-abceb7e1c41e",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sync",
            "direct": false,
            "version": "v0.22.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.46.0",
            "ecosystem": "go"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 25,
        "direct_count": 9,
        "indirect_count": 16
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 3,
        "merged_prs": 45,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 20,
        "closed_unmerged_prs": 3
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "Tannex",
          "commits": 174,
          "avatar_url": "https://avatars.githubusercontent.com/u/5255948?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 4,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.978
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "release.yml",
        "winget.yml"
      ],
      "has_docs_dir": true,
      "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": 10,
            "reason": "14 out of 14 merged PRs checked by a CI test -- score normalized to 10",
            "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/13 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 6,
            "reason": "project has 2 contributing companies or organizations -- score normalized to 6",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 10,
            "reason": "update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "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": 10,
            "reason": "SAST tool is run on all commits",
            "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": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "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": "286be7f9afb8a6f02064426614e7ad56f97a949a",
        "ran_at": "2026-07-22T10:49:48Z",
        "aggregate_score": 4.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": true
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-22T04:54:41Z",
      "oldest_open_prs": [
        {
          "number": 67,
          "created_at": "2026-07-21T06:53:09Z",
          "last_comment_at": "2026-07-21T20:09:34Z",
          "last_comment_author": "Tannex"
        },
        {
          "number": 68,
          "created_at": "2026-07-21T13:09:42Z",
          "last_comment_at": "2026-07-21T20:08:51Z",
          "last_comment_author": "Tannex"
        },
        {
          "number": 69,
          "created_at": "2026-07-21T14:14:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-21T19:08:46Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Tannex/cq",
    "host": "github.com",
    "name": "cq",
    "owner": "Tannex"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 56,
      "inputs": {
        "security": 57,
        "vitality": 69,
        "community": 24,
        "governance": 54,
        "engineering": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 69,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "commits_last_year": 180,
              "human_commit_share": 0.98,
              "days_since_last_push": 0,
              "active_weeks_last_year": 2
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "180 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 180
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 2,
              "latest_release_tag": "v0.2.0",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "2 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 54,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 18,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.978
            },
            "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 98% of commits",
                "points": 0.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 98
                    }
                  }
                ],
                "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 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 83,
            "inputs": {
              "merged_prs": 45,
              "open_issues": 0,
              "closed_issues": 20,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 3
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 46.8,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "45/48 decided PRs merged",
                "points": 35.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 45,
                      "decided": 48
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/13 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 36,
            "inputs": {
              "followers": 0,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "Tannex",
              "public_repos": 8,
              "account_age_days": 4720
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "0 followers of Tannex",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "Tannex"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "8 public repos, account ~12 yr old",
                "points": 18.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 8
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 12
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "github.com/Tannex/cq"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "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 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "2 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "good",
        "name": "Engineering Quality",
        "value": 71,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "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": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "14 out of 14 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "cli",
                "mainframe",
                "querying",
                "tui",
                "zosmf"
              ],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "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": 25,
                "status": "met",
                "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": "5 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 5
                    }
                  }
                ],
                "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": "moderate",
        "name": "Security",
        "value": 57,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 46,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.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": "14 out of 14 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "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/13 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 1.5,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "update tool detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is run on all commits",
                "points": 5,
                "status": "met",
                "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": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "0 existing vulnerabilities detected",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 25 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 25
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 25,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 25,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 66,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.837,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "82 of 98 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 82,
                      "sampled": 98
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 74,
            "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.46,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0.02
            },
            "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": "46 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 46,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "2 of the last 100 commits are automated dependency updates",
                "points": 8,
                "status": "met",
                "details": [
                  {
                    "code": "dependency_bot_commits",
                    "params": {
                      "count": 2,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 75901,
              "source_files_sampled": 90,
              "oversized_source_files": 1
            },
            "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": "1/90 source files over 60KB",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 90,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [],
  "report_type": "repository",
  "generated_at": "2026-07-22T10:50:02.994441Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/Tannex/cq.svg",
  "full_name": "Tannex/cq",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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 v1.13.0, esquema v0.26.0 — metodología completa · wiki de métricas.

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