公开记录
软件健康报告模式 0.26.0 · 指标 1.13.0 · 2026-07-22 10:50 UTC

Tannex / cq

My personal mainframe toolbox

GoMIT★ 0 星标⑂ 0 复刻始于 2026年7月在 GitHub 上查看 ↗

Tannex/cq 的健康指数为 100 分中的 56 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(71/100),最低的是Community & Adoption(24/100)。 最近一次更新在今天。 近期的大部分工作由 1 位贡献者完成。

56
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

56
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

0 关注者8 个公开仓库始于 2013年8月@Bankdata

该仓库由个人账户拥有。相较于组织支持的项目,单一所有者项目的延续性风险更高。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/Tannex/cqv0.2.0-20 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

69中等 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 0 天前
1.4/36提交节奏 — 52 周中有 2 周有提交
18/18提交量 — 最近一年 180 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year180
human_commit_share0.98
days_since_last_push0
active_weeks_last_year2

发布纪律

90优秀
评分方式
27/27有发布版本 — 已发布 2 个发布版本
36/36发布时效 — 最近一次发布版本于 0 天前
27/27发布节奏 — 约每 4 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — Project has not signed or included provenance with any releases.
所用输入
releases_count2
latest_release_tagv0.2.0
releases_from_tags
days_since_latest_release0
mean_days_between_releases4

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

24危急 · 占总体的 18%
评分方式
0/60星标 — 0 个星标
0/25复刻 — 0 个复刻
0/15关注者 — 0 位关注者
所用输入
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

54中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
0.5/22.5提交分布 — 头号贡献者编写了 98% 的提交
2.7/13.5贡献者广度 — 2 位贡献者
6/10OpenSSF Scorecard:Contributors — project has 2 contributing companies or organizations -- score normalized to 6
所用输入
bus_factor1
contributors_sampled2
top_contributor_share0.978
评分方式
46.8/46.8议题解决 — 100% 的议题已关闭
35.9/38.3PR 接受 — 已裁定的 PR 中 45/48 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/13 approved changesets -- score normalized to 0
所用输入
merged_prs45
open_issues0
closed_issues20
issue_closed_ratio1
closed_unmerged_prs3
评分方式
10/30所有权背书 — 个人(用户)账户
0/20已验证域名 — 不适用于个人账户
0/25所有者影响力 — Tannex 有 0 位关注者
18.9/25既往记录 — 8 个公开仓库,账户约 12 年
所用输入
followers0
owner_typeUser
is_verified
owner_loginTannex
public_repos8
account_age_days4,720
已排除计分(无数据或不适用):已验证域名。 其余权重已重新归一化。
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 0 天前
12/20版本历史 — 2 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/Tannex/cq
ecosystemsgo
any_deprecated
min_days_since_publish0

工程质量

基础的工程与文档实践是否到位?

71良好 · 占总体的 20%

工程实践

68中等
评分方式
24/24CI 工作流 — 3 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-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
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

75良好
评分方式
30/30README
25/25文档目录
0/15文档 / 主页站点
10/10仓库描述
10/10主题标签 — 5 个主题标签
0/10Wiki
所用输入
topicscli, mainframe, querying, tui, zosmf
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

57中等 · 占总体的 16%

安全态势

46存在风险
评分方式
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.5许可证 — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — 无数据
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
所用输入
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.6
已排除计分(无数据或不适用):packaging。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
0/25间接依赖不含已知公告 — 在此范围内,传递依赖集合无法与开发和测试依赖区分
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories0
affected_packages0
assessed_packages25
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
已排除计分(无数据或不适用):间接依赖不含已知公告, 没有长期未处理的公告。 其余权重已重新归一化。 已将 25 个已解析依赖与 OSV 比对。 该仓库未发布任何索引可解析的软件包,因此改为评估仓库依赖图。该图将开发与测试版本固定同交付的依赖混在一起,因此仅对声明的运行时依赖计分;传递性发现仅作为背景信息列出,不计入评分。 未对可达性进行分析。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

66中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 98 次人类提交中有 82 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.837
agent_instruction_files
agent_instruction_max_bytes
评分方式
12.6/18一条命令的引导启动 — go.mod(工具链约定,无任务运行器)
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 46 次由代理编写或署名代理
8/8自动化维护 — 最近 100 次提交中有 2 次为自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.46
toolchain_manifestsgo.mod
dependency_bot_commit_share0.02
评分方式
45/45可类型检查的代码 — Go(静态类型)
54.4/55可控的文件大小 — 采样的 90 个源文件中有 1 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes75,901
source_files_sampled90
oversized_source_files1

关键数据

0GitHub 星标
2贡献者
180最近 12 个月提交数
0距最近推送天数
2发布版本数
1巴士系数(bus factor)
0开放议题
Go软件包生态系统数

更多细节

OpenSSF Scorecard 4.6 / 10
4.6综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。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
不适用Packagingpackaging 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
直接依赖 9
注册表软件包版本约束清单文件
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
全部依赖 25

来自 GitHub 依赖图的完整解析依赖集合:9 个直接依赖与 16 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
Gocharm.land/bubbles/v2v2.1.1直接
Gocharm.land/bubbletea/v2v2.0.8直接
Gocharm.land/lipgloss/v2v2.0.5直接
Gogithub.com/charmbracelet/x/ansiv0.11.7直接
Gogithub.com/danieljoos/wincredv1.2.3直接
Gogithub.com/godbus/dbus/v5v5.2.2直接
Gogithub.com/itchyny/gojqv0.12.19直接
Gogithub.com/zalando/go-keyringv0.2.8直接
Gogolang.org/x/textv0.40.0直接
Gogithub.com/atotto/clipboardv0.1.4间接
Gogithub.com/charmbracelet/colorprofilev0.4.3间接
Gogithub.com/charmbracelet/ultravioletv0.0.0-20260703014108-f5a850f9c2b7间接
Gogithub.com/charmbracelet/x/termv0.2.2间接
Gogithub.com/charmbracelet/x/termiosv0.1.1间接
Gogithub.com/charmbracelet/x/windowsv0.2.2间接
Gogithub.com/clipperhouse/displaywidthv0.11.0间接
Gogithub.com/clipperhouse/uax29/v2v2.7.0间接
Gogithub.com/itchyny/timefmt-gov0.1.8间接
Gogithub.com/lucasb-eyer/go-colorfulv1.4.0间接
Gogithub.com/mattn/go-runewidthv0.0.24间接
Gogithub.com/muesli/cancelreaderv0.2.2间接
Gogithub.com/rivo/unisegv0.4.7间接
Gogithub.com/xo/terminfov0.0.0-20220910002029-abceb7e1c41e间接
Gogolang.org/x/syncv0.22.0间接
Gogolang.org/x/sysv0.46.0间接
依赖安全公告 0

该仓库未发布可被索引解析的包,因此评估的是其自身的依赖图——共 25 个包,其中也包含从不交付的开发与测试版本固定:0 个存在已知公告,0 个为直接依赖。

没有已知公告影响已评估的依赖。

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "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"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.26.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计Go.