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