Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 04:50 UTC

antopolskiy / kanban-md

File-based kanban board for autonomous agentic loop. CLI and TUI for multi-agent workflows. Skills included.

GoMIT★ 171 stars⑂ 22 forkssince Feb 2026View on GitHub ↗

antopolskiy/kanban-md holds a health index of 63 out of 100, placing it in the Moderate band. It scores highest on AI Readiness (86/100) and lowest on Security (45/100). It was last updated 4 days ago. A single contributor accounts for most of its recent work.

63
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

63
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Sergey AntopolskiyPersonal account
43 followers43 public repossince Oct 2016MosaiQLabs

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
Gogithub.com/antopolskiy/kanban-mdv0.36.1-664 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

78Good · 22% of overall
How it's scored
36/36Push recency — last push 4 days ago
5.5/36Commit cadence — 8/52 weeks with commits
18/18Commit volume — 333 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year333
human_commit_share1
days_since_last_push4
active_weeks_last_year8
How it's scored
27/27Ships releases — 49 releases published
36/36Release recency — latest release 4 days ago
27/27Release cadence — a release every ~17.4 days
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Inputs used
releases_count49
latest_release_tagv0.36.1
releases_from_tagsno
days_since_latest_release4
mean_days_between_releases17.4

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

49At risk · 18% of overall
How it's scored
36.2/60Stars — 171 stars
11/25Forks — 22 forks
1.7/15Watchers — 3 watchers
Inputs used
forks22
stars171
watchers3
growth_stateorganic
growth_factor_pct100
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

58Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0.7/22.5Commit distribution — top contributor authored 97% of commits
4.1/13.5Contributor breadth — 3 contributors
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Inputs used
bus_factor1
contributors_sampled3
top_contributor_share0.97
How it's scored
40.1/46.8Issue resolution — 86% of issues closed
28.7/38.3PR acceptance — 3/4 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 1/19 approved changesets -- score normalized to 0
Inputs used
merged_prs3
open_issues1
closed_issues6
issue_closed_ratio0.857
closed_unmerged_prs1
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
11.8/25Owner reach — 43 followers of antopolskiy
24/25Track record — 43 public repos, account ~9 yr old
Inputs used
followers43
owner_typeUser
is_verified
owner_loginantopolskiy
public_repos43
account_age_days3,551
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 1 package(s) on go
35/35Publish recency — latest publish 4 days ago
20/20Version history — 66 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesgithub.com/antopolskiy/kanban-md
ecosystemsgo
any_deprecatedno
min_days_since_publish4

Engineering Quality

Are baseline engineering and documentation practices in place?

78Good · 20% of overall
How it's scored
24/24CI workflows — 3 workflow(s)
24/24Tests present
16/16Linter config — .golangci.yml
0/9.6Pre-commit hooks
0/6.4.editorconfig
10/20OpenSSF Scorecard: CI-Tests — 1 out of 2 merged PRs checked by a CI test -- score normalized to 5
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno

Documentation

85Excellent
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 14 topics
10/10Wiki
Inputs used
topicsai-agents, cli, developer-tools, go, kanban, markdown, project-management, task-management, terminal, tui, agent-skills, multi-agent, agent-loops, loops
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

45At risk · 16% of overall
How it's scored
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
1.2/2.5CI-Tests — 1 out of 2 merged PRs checked by a CI test -- score normalized to 5
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 1/19 approved changesets -- score normalized to 0
1.5/2.5Contributors — project has 2 contributing companies or organizations -- score normalized to 6
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
5/5Fuzzing — project is fuzzed
2.5/2.5License — license file detected
7.5/7.5Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
0/7.5Vulnerabilities — 15 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4.5

AI Readiness

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.

86Excellent · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md, CLAUDE.md, GEMINI.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 87 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.87
agent_instruction_filesAGENTS.md, CLAUDE.md, GEMINI.md
agent_instruction_max_bytes14,023
How it's scored
18/18One-command bootstrap — Makefile
22/22Automated tests
11/11Lint / format config — .golangci.yml
11/11Static type checking — Go (statically typed)
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 39 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Inputs used
has_nixno
has_testsyes
lockfilesgo.sum
has_dockerfileno
typed_languageyes
bootstrap_filesMakefile
has_devcontainerno
has_linter_configyes
typecheck_configs
agent_commit_share0.39
toolchain_manifestsgo.mod
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Go (statically typed)
54.4/55Manageable file sizes — 2/174 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes71,244
source_files_sampled174
oversized_source_files2

Key facts

171GitHub stars
3contributors
333commits, last 12 months
4days since last push
49releases
1bus factor
1open issues
Gopackage ecosystems

Data collection warnings

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

More detail

Star and fork history 171 ★ / 22 ⇿
171Stars
22Forks
15Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

0408012016020017122432026-022026-052026-07
Major 0Minor 6Patch 9
OpenSSF Scorecard 4.5 / 10
4.5aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).Scorecard v5.5.0 · 2026-07-22 04:50 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
5CI-Tests1 out of 2 merged PRs checked by a CI test -- score normalized to 5
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 1/19 approved changesets -- score normalized to 0
6Contributorsproject has 2 contributing companies or organizations -- score normalized to 6
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
0Vulnerabilities15 existing vulnerabilities detected
Direct dependencies 12
RegistryPackageVersion constraintManifest
Gogithub.com/charmbracelet/bubblesv0.21.1go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/glamourv0.10.0go.mod
Gogithub.com/charmbracelet/lipglossv1.1.1-0.20250404203927-76690c660834go.mod
Gogithub.com/creack/ptyv1.1.24go.mod
Gogithub.com/fsnotify/fsnotifyv1.9.0go.mod
Gogithub.com/muesli/termenvv0.16.0go.mod
Gogithub.com/spf13/cobrav1.10.2go.mod
Gogithub.com/spf13/pflagv1.0.10go.mod
Gogo.yaml.in/yaml/v3v3.0.4go.mod
Gogolang.org/x/sysv0.40.0go.mod
Gogolang.org/x/termv0.39.0go.mod
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [
        "ai-agents",
        "cli",
        "developer-tools",
        "go",
        "kanban",
        "markdown",
        "project-management",
        "task-management",
        "terminal",
        "tui",
        "agent-skills",
        "multi-agent",
        "agent-loops",
        "loops"
      ],
      "is_fork": false,
      "size_kb": 3217,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 1344112,
        "CSS": 8034,
        "HTML": 11381,
        "Shell": 10425,
        "Makefile": 2743
      },
      "pushed_at": "2026-07-17T22:13:35Z",
      "created_at": "2026-02-07T13:09:55Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T02:47:14Z",
      "description": "File-based kanban board for autonomous agentic loop. CLI and TUI for multi-agent workflows. Skills included.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://www.linkedin.com/in/antop/",
      "name": "Sergey Antopolskiy",
      "type": "User",
      "login": "antopolskiy",
      "company": "MosaiQLabs",
      "location": "Reggio Emilia, Italy",
      "followers": 43,
      "avatar_url": "https://avatars.githubusercontent.com/u/23148726?v=4",
      "created_at": "2016-10-30T10:02:21Z",
      "is_verified": null,
      "public_repos": 43,
      "account_age_days": 3551
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.36.1",
          "kind": "patch",
          "published_at": "2026-07-17T22:17:54Z"
        },
        {
          "tag": "v0.35.0",
          "kind": "minor",
          "published_at": "2026-07-16T09:43:00Z"
        },
        {
          "tag": "v0.34.1",
          "kind": "patch",
          "published_at": "2026-06-19T07:06:53Z"
        },
        {
          "tag": "v0.34.0",
          "kind": "minor",
          "published_at": "2026-06-18T20:49:23Z"
        },
        {
          "tag": "v0.33.0",
          "kind": "minor",
          "published_at": "2026-02-24T20:49:28Z"
        },
        {
          "tag": "v0.32.2",
          "kind": "patch",
          "published_at": "2026-02-22T16:40:36Z"
        },
        {
          "tag": "v0.32.1",
          "kind": "patch",
          "published_at": "2026-02-21T12:10:10Z"
        },
        {
          "tag": "v0.31.0",
          "kind": "minor",
          "published_at": "2026-02-19T13:52:50Z"
        },
        {
          "tag": "v0.30.0",
          "kind": "minor",
          "published_at": "2026-02-15T10:41:37Z"
        },
        {
          "tag": "v0.29.2",
          "kind": "patch",
          "published_at": "2026-02-10T21:39:03Z"
        },
        {
          "tag": "v0.29.1",
          "kind": "patch",
          "published_at": "2026-02-10T18:23:13Z"
        },
        {
          "tag": "v0.29.0",
          "kind": "minor",
          "published_at": "2026-02-10T16:17:07Z"
        },
        {
          "tag": "v0.28.3",
          "kind": "patch",
          "published_at": "2026-02-10T14:38:39Z"
        },
        {
          "tag": "v0.28.2",
          "kind": "patch",
          "published_at": "2026-02-10T09:40:22Z"
        },
        {
          "tag": "v0.28.1",
          "kind": "patch",
          "published_at": "2026-02-10T09:34:18Z"
        },
        {
          "tag": "v0.28.0",
          "kind": "minor",
          "published_at": "2026-02-09T18:24:55Z"
        },
        {
          "tag": "v0.27.2",
          "kind": "patch",
          "published_at": "2026-02-09T17:35:43Z"
        },
        {
          "tag": "v0.26.0",
          "kind": "minor",
          "published_at": "2026-02-09T16:25:21Z"
        },
        {
          "tag": "v0.25.0",
          "kind": "minor",
          "published_at": "2026-02-09T16:02:33Z"
        },
        {
          "tag": "v0.24.0",
          "kind": "minor",
          "published_at": "2026-02-09T14:47:16Z"
        },
        {
          "tag": "v0.23.3",
          "kind": "patch",
          "published_at": "2026-02-09T12:37:56Z"
        },
        {
          "tag": "v0.23.2",
          "kind": "patch",
          "published_at": "2026-02-09T11:33:22Z"
        },
        {
          "tag": "v0.23.1",
          "kind": "patch",
          "published_at": "2026-02-09T10:24:42Z"
        },
        {
          "tag": "v0.22.0",
          "kind": "minor",
          "published_at": "2026-02-09T08:52:55Z"
        },
        {
          "tag": "v0.21.1",
          "kind": "patch",
          "published_at": "2026-02-09T08:26:19Z"
        },
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-02-09T08:00:46Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-02-09T07:14:19Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-02-09T06:20:21Z"
        },
        {
          "tag": "v0.18.1",
          "kind": "patch",
          "published_at": "2026-02-08T17:46:46Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-02-08T17:40:16Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-02-08T17:29:22Z"
        },
        {
          "tag": "v0.16.3",
          "kind": "patch",
          "published_at": "2026-02-08T16:43:40Z"
        },
        {
          "tag": "v0.16.2",
          "kind": "patch",
          "published_at": "2026-02-08T16:35:38Z"
        },
        {
          "tag": "v0.16.1",
          "kind": "patch",
          "published_at": "2026-02-08T16:03:28Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-02-08T08:06:43Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-02-08T08:02:44Z"
        },
        {
          "tag": "v0.13.8",
          "kind": "patch",
          "published_at": "2026-02-08T08:00:45Z"
        },
        {
          "tag": "v0.13.5",
          "kind": "patch",
          "published_at": "2026-02-08T07:27:53Z"
        },
        {
          "tag": "v0.13.1",
          "kind": "patch",
          "published_at": "2026-02-08T07:13:38Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-02-08T07:09:53Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-02-08T06:26:52Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-02-07T19:20:59Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-02-07T18:40:50Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2026-02-07T16:05:03Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-02-07T15:56:31Z"
        },
        {
          "tag": "v0.2.2",
          "kind": "patch",
          "published_at": "2026-02-07T15:28:10Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-02-07T15:22:52Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-02-07T15:14:48Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-02-07T14:42:54Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "3866c357ff888a4b593603189dc7d3cde3dce302",
          "body": null,
          "is_bot": false,
          "headline": "merge: stabilize consecutive TUI mouse drags",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-17T22:11:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6af566ba97ae8a3b4c3db5d9b1490ac4e8bd338",
          "body": null,
          "is_bot": false,
          "headline": "test: stabilize consecutive TUI mouse drags",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-17T22:10:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c68b68652b491465304ec16d797783c278ac2658",
          "body": null,
          "is_bot": false,
          "headline": "Merge remote-tracking branch 'origin/main'",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-17T21:57:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df3b686883dc648b738ef254b9729df58b2779af",
          "body": "feat: add TUI mouse controls and drag-to-move",
          "is_bot": false,
          "headline": "Merge pull request #10 from antopolskiy/task/219-tui-drag-to-move",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-17T21:57:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99d3ae655ae954330a77dab2ebe97736ec8c0058",
          "body": null,
          "is_bot": false,
          "headline": "docs: clarify TUI mouse mode",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-17T21:52:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65d5974df46b94ce76789d2a83381f35f98dd05e",
          "body": null,
          "is_bot": false,
          "headline": "merge: simplify TUI status shortcuts",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T12:55:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a466ca203b3c295622870294e5ed0df640011b2",
          "body": "- prioritize card count, help, and the optional mouse indicator at the left edge\n- remove the board title and next/previous hints from the status line\n- emphasize shortcut characters inside compact action labels and add normal/mouse PTY coverage",
          "is_bot": false,
          "headline": "feat: simplify TUI status shortcuts",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T12:55:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b4b9e91cdcef6db9696e8779e9e69fc0e984e3c",
          "body": null,
          "is_bot": false,
          "headline": "merge: remove TUI drag column shading",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T12:37:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dd9a560b85ea93e47b518328fb8dd7a3cb31bb4",
          "body": "- remove the full-height adaptive destination background that created visual noise\n- retain the destination header highlight, arrow marker, and release-to-move hint\n- restore the pre-shading renderer and test surface exactly",
          "is_bot": false,
          "headline": "revert: remove TUI drag column shading",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T12:36:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b6af6e9c7df1a0866ea1db61e0ab9f5d013089df",
          "body": null,
          "is_bot": false,
          "headline": "merge: shade TUI drag destination columns",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T11:55:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "644fdfb8830b4a07f542e277fd492f7d2dcaccd7",
          "body": "- add an adaptive full-height background tint beneath the existing destination header highlight\n- clear the tint whenever the pointer returns to the source column or the gesture ends\n- cover dark and light terminal profiles with focused rendering tests",
          "is_bot": false,
          "headline": "feat: shade TUI drag destination columns",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T11:54:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43c48d824f7f0953e36d28ed3d3dc060daf5c280",
          "body": null,
          "is_bot": false,
          "headline": "merge: fix TUI drag traversal and claimed moves",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T10:57:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9c9bff42bcdfa77ba0726b5839bf923edcaa413",
          "body": "- allow held drags to cross the source column and choose any later destination\n- preserve existing claims while permitting TUI status moves in either direction\n- add model and PTY regressions for traversal, auto-claim round trips, and foreign claims",
          "is_bot": false,
          "headline": "fix: keep TUI drag gestures and claims movable",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T10:55:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "96f5b1d4f5fcdc43537521c16a7a9c779a82a590",
          "body": null,
          "is_bot": false,
          "headline": "merge: add TUI drag-to-move",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T10:38:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17609946e2f56ebd580f2feb42c1657137a86051",
          "body": null,
          "is_bot": false,
          "headline": "merge: add opt-in TUI mouse navigation",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T10:38:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d714135816ec2e95a48144d366f4a63ce2b7fa8a",
          "body": "- resolve held-card releases against rendered destination columns\n- highlight valid drop targets and show a release-to-move hint\n- route explicit task IDs through existing claim, WIP, timestamp, and logging rules\n- cover successful, canceled, and rejected drags with model, snapshot, and PTY tests",
          "is_bot": false,
          "headline": "feat: add TUI drag-to-move",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T10:37:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "081dfaa2e74e626e565a5b6bd9168c788680de6a",
          "body": "- add click, double-click, Back, and wheel handling behind --mouse\n- derive clipped mouse targets from the rendered board layout\n- extend synthetic, snapshot, fuzz, and PTY coverage for mouse navigation\n- document terminal selection bypass and keyboard fallback",
          "is_bot": false,
          "headline": "feat: add opt-in TUI mouse navigation",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T10:22:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2814390848aa4a5a7a8c108a0f78897d997b1f11",
          "body": null,
          "is_bot": false,
          "headline": "docs: assess TUI drag-to-move interactions",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T09:54:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d87202de49097344d19cbf5baf0e63ef059eb74d",
          "body": null,
          "is_bot": false,
          "headline": "docs: design TUI mouse test strategy",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T09:49:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8813b8efac369e03b4f0893d36c07a00438b43bc",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'task/215-evaluate-tui-mouse-support'",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T09:38:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d8f4493b5b21c388798068b4b701cf84cb8869b",
          "body": null,
          "is_bot": false,
          "headline": "docs: assess TUI mouse support proposal",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T09:38:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b83fc7fe9e04b7e11f2b56b73728b7a531024100",
          "body": null,
          "is_bot": false,
          "headline": "docs: require contributor attribution in release notes",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T09:35:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8609d3262589a3523dec352ffdc9882e21b188ec",
          "body": "- Add project-local Codex copies of the bundled kanban skills\n- Keep Codex and Claude skill guidance synchronized\n- Warn agents to quote body text that contains shell substitutions",
          "is_bot": false,
          "headline": "docs: add Codex project skills and shell safety guidance",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T09:35:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b7e41239b055c4b8704858b1a6365f53b17eeb8",
          "body": "- Make active claimed task files read-only on Unix-like systems\n- Temporarily unlock files for CLI writes and restore permissions after claim changes\n- Repair stale permissions during consistency checks\n- Add unit, CLI, TUI, and end-to-end coverage",
          "is_bot": false,
          "headline": "feat: protect claimed task files from direct edits",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T09:34:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a93e58c86c5ae458465e7a7c910730dcb6039ea3",
          "body": "- Format migrated command and board tests\n- Remove dead helpers left by the refactor\n- Tighten temporary-directory permissions and annotate trusted test reads\n- Make nil assertions explicit for static analysis",
          "is_bot": false,
          "headline": "fix: restore lint after board mutation refactor",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-16T09:33:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9e36eb3c41bca5683156357e4c94fe8f0a179e76",
          "body": "…nal-api\n\nrefactor: move functionality to internal API for handoff, pick, move, and edit",
          "is_bot": false,
          "headline": "Merge pull request #7 from vibbix/feature/move-functionality-to-inter…",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-07-12T18:59:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1e7968a30359068bf9d646701f95def603e1f27",
          "body": "- Add archive --claim support so claimed tasks can be archived by their claimant.\n- Validate PickAndClaim claimant and status parameters in the board layer before mutation.\n- Cover both behaviors with focused regression tests and document the new archive flag.",
          "is_bot": false,
          "headline": "fix: tighten PR 7 mutation boundaries",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-06-29T11:55:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0083e5c7a3ec5bdf40ba39b715b65e77e56630c3",
          "body": null,
          "is_bot": false,
          "headline": " - more tests",
          "author_name": "Mark Beznos",
          "author_login": "vibbix",
          "committed_at": "2026-06-26T13:12:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3898e50ec3cc188a4c515c0b88abcfc0029bf0e",
          "body": null,
          "is_bot": false,
          "headline": " - migrated archive",
          "author_name": "Mark Beznos",
          "author_login": "vibbix",
          "committed_at": "2026-06-25T19:51:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdc7af8f1c6a1960e9e7c650fde0289ef1e718d7",
          "body": null,
          "is_bot": false,
          "headline": " - removed dead wrappers & dupes",
          "author_name": "Mark Beznos",
          "author_login": "vibbix",
          "committed_at": "2026-06-25T19:36:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "246c0ffd62c5b36d129f401241aa978a29305dd4",
          "body": null,
          "is_bot": false,
          "headline": " - moved tests inside",
          "author_name": "Mark Beznos",
          "author_login": "vibbix",
          "committed_at": "2026-06-25T19:36:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "76035ce29ab18b0aadaf517470056b0bd97f6913",
          "body": " - minor formatting",
          "is_bot": false,
          "headline": " - improved CLI errors",
          "author_name": "Mark Beznos",
          "author_login": "vibbix",
          "committed_at": "2026-06-25T18:56:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f8185d530b490bfbf538e8b37fb1da7cbc660969",
          "body": null,
          "is_bot": false,
          "headline": " - govet/perfsprint fixes",
          "author_name": "Mark Beznos",
          "author_login": "vibbix",
          "committed_at": "2026-06-24T20:17:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1cb116f98e625eedbbddf55327f15549a4f7df3",
          "body": null,
          "is_bot": false,
          "headline": "test: add test coverage for board.Handoff",
          "author_name": "Mark Beznos",
          "author_login": "vibbix",
          "committed_at": "2026-06-24T19:46:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "87c931e3c894ff965f882108823067387cd73f71",
          "body": "… and edit",
          "is_bot": false,
          "headline": "refactor: move functionality to internal API for handoff, pick, move,…",
          "author_name": "Mark Beznos",
          "author_login": "vibbix",
          "committed_at": "2026-06-24T19:30:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6e47c78369440765885a51e01e7a8934c11e601",
          "body": null,
          "is_bot": false,
          "headline": "ci: pin release lint version",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-06-18T20:43:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "79d5d89f41b61954813641db75fa479d8fe81a4b",
          "body": null,
          "is_bot": false,
          "headline": "docs: document title sort field",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-06-18T20:41:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d01954c66e0aeff221f16a79c24dfcc762d3a909",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'codex/review-pr-6'",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-06-18T20:41:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4808406e925330858a8248651f1bda46bf92830c",
          "body": null,
          "is_bot": false,
          "headline": "ci: pin golangci-lint version",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-06-18T20:33:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f12a885b3f3b320f27e71046971d52648b610345",
          "body": "Extend the TUI `/` filter so a query starting with `#` searches ticket IDs instead of titles.\n\n- While typing, the digits prefix-match the ID: `#12` matches #12, #121, etc.\n- A trailing space makes the match exact: `#12 ` matches only #12.\n- A bare `#` (no digits yet) does not filter.\n- Plain querie\n[…]\n exact ID matching. Updates the in-app help, README, and adds behavioral tests for prefix, exact, bare-hash, and title-mode cases.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: support ticket-ID search in TUI filter",
          "author_name": ".kai",
          "author_login": "kaijen",
          "committed_at": "2026-06-18T17:06:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67a6859fdc3a109a225fccfc7f6c1799096fc5ce",
          "body": "Add two interactive controls to the terminal board.\n\n- `s` cycles the sort field (priority → created → updated → title) and `S` toggles ascending/descending. The active sort is shown in the status bar as `s:sort[field↕]`. Previously the board was hard-coded to sort by priority descending.\n- `/` open\n[…]\n-app help dialog, README keyboard-shortcuts table, and snapshot golden files. Add behavioral and snapshot tests for both features.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add sort cycling and title search to TUI",
          "author_name": ".kai",
          "author_login": "kaijen",
          "committed_at": "2026-06-18T16:49:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "630bdec7b52e1378a8ed3d3750b1f5c44d079161",
          "body": "The shared mutation layer enforces require_claim validation, which would block TUI users from moving tasks to statuses like in-progress that require a claim. The TUI now auto-claims as \"tui@hostname\" when the target status requires a claim, and passes the claimant to delete and edit operations as well.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: auto-claim in TUI when require_claim is set",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-03-04T13:11:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "237ba22b4ed7b94a3bcf51aa850abb2c43dfbddb",
          "body": "Single source of truth for edit logic including find/read, claim validation, post-validation (deps, require_claim, WIP on status change), write-and-rename, and transition logging.\n\nUses a callback-based design: caller provides applyFn that mutates the task, shared function handles surrounding valida\n[…]\nLI passes cobra flag application; TUI passes widget values.\n\nTUI gains claim validation and dependency validation on edit (was missing before).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: extract Edit to internal/board/mutate.go",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-03-04T12:09:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d3c9a43844dca38748dcc7cb2647a78f5fddbaff",
          "body": "Single source of truth for create logic including param validation, dependency validation, WIP limits (class-aware), file generation, NextID management, and logging.\n\nCLI builds CreateParams from cobra flags; TUI builds them from input widgets. Both delegate to board.Create. TUI gains WIP limit and dependency validation on create (was missing before).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: extract Create to internal/board/mutate.go",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-03-04T12:04:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2b06b5c3b396dfdfd8a61e1c906a802dc9c44c6c",
          "body": "Single source of truth for move logic including claim validation, WIP limits (class-aware), require_claim enforcement, blocked task warnings, timestamps, and logging.\n\nCLI delegates to board.Move after resolving target status from flags/args. TUI gains WIP limit and claim validation on move (was missing before).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: extract Move to internal/board/mutate.go",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-03-04T11:58:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c2983b4c284773dcc3b04e5e0e955070cc13a393",
          "body": "Single source of truth for delete (soft-archive) logic. Both CLI and TUI now call board.Delete, which handles FindByID, Read, CheckClaim, FindDependents, archive status update, timestamps, Write, and LogMutation.\n\nTUI gains claim validation on delete (was missing before).\n\nFix: preserve delete error across loadTasks() reload so error messages are visible in TUI.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: extract Delete to internal/board/mutate.go",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-03-04T11:54:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b156f0bb526a18dd5e616d1274d8f6983162c532",
          "body": "Move the identical writeAndRename/writeTaskAndRename function from cmd/edit.go\nand internal/tui/board.go into a shared task.WriteAndRename. Both callers now\nuse the shared function, eliminating the duplication.",
          "is_bot": false,
          "headline": "refactor: extract WriteAndRename to internal/task/file.go",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-03-04T11:46:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8be818d42d1e89b95de7e8685fba30fa0bf436a",
          "body": "Tag truncation in cardContentLines used tagStr[:tagMaxLen-3] without checking if tagMaxLen was large enough, causing a panic with negative slice bounds on narrow terminals. Also added a minimum column width (8) to prevent cascading zero-width issues.\n\nCloses: https://github.com/antopolskiy/kanban-md/issues/5",
          "is_bot": false,
          "headline": "fix: prevent TUI panic on narrow terminals (slice bounds out of range)",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-03-04T10:53:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f6eab53591c1c0baf21b40dd02b1cade3d2a63d",
          "body": "…te IDs\n\nThe TUI create path (board.go:executeCreate) used the in-memory NextID without any file lock or disk reload. If a CLI create ran while the TUI was open, the TUI's cached NextID was stale, producing duplicate task IDs.\n\nFix: acquire exclusive filelock before creating, reload NextID from disk inside the lock (matching the CLI create fix from 3a88ce0).\n\nCloses: https://github.com/antopolskiy/kanban-md/issues/3",
          "is_bot": false,
          "headline": "fix: add file lock and config reload to TUI create to prevent duplica…",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-03-04T10:41:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "520c978a485ea099da7311d1b2f6124193795be9",
          "body": "- Add a consistency pass on config load that detects duplicate task IDs, filename/frontmatter ID mismatches, malformed files, and next_id drift.\n- Auto-repair duplicate and mismatched IDs, advance next_id to a safe value, and print repair warnings to stderr.\n- Harden task parsing by treating missing\n[…]\n/status) as malformed.\n- Update create path to use the consistency-aware config loader and expand unit/e2e coverage for corruption and repair scenarios.\n- Document the self-healing behavior in README.",
          "is_bot": false,
          "headline": "feat: auto-repair task ID consistency issues",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-24T20:42:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e7bc3576b9f312e81e5330ffd2ab0db4c6186fbc",
          "body": "- Print full task details (including body) after non-JSON pick confirmations so agents can act without a follow-up show command.\n- Add --no-body to keep one-line pick output for scripting or terse workflows.\n- Reuse show rendering via shared task-detail output helper and update unit/e2e coverage.\n- Update README and kanban-based-development skill docs to reflect the new default behavior.",
          "is_bot": false,
          "headline": "feat: show picked task details in pick output",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-24T20:28:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6eb55a8251b480c172ed57ba34ebe6835f1fd3bb",
          "body": "- split monolithic TUI end-to-end suite into focused files with shared harness\n\n- add PTY-backed keyboard-flow coverage for create/edit/delete/move/priority/help paths\n\n- add creack/pty dependency used by the harness",
          "is_bot": false,
          "headline": "test: expand TUI e2e keyboard coverage",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-22T16:33:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7eeca35b8051fd1e16021b29aa18e51d9fb5c794",
          "body": null,
          "is_bot": false,
          "headline": "Merge: implement text input components for create/edit fields",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-22T15:43:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfd49d21b7a90593bfec9e8f86f5109bde7f48b2",
          "body": "- Replace create/edit title/tags manual text-edit handling with bubbles textinput models\n\n- Replace body editing with bubbles textarea model\n\n- Add focused-step navigation and input layout for bounded, wrapped create fields\n\n- Update create flow tests to match component-backed rendering and behavior",
          "is_bot": false,
          "headline": "feat: use bubble components for create/edit inputs",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-22T15:42:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a04961101476d06eabf049b80223b73ec0ed59ae",
          "body": null,
          "is_bot": false,
          "headline": "docs: evaluate terminal text input components for create/edit",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-22T14:19:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a944b159fe1d76d23da22da11aeee2da5ae8bdd4",
          "body": null,
          "is_bot": false,
          "headline": "feat: wrap create dialog title/body inputs",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-22T14:18:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a8cdc732136320dae540e678bd2173a5f91b8fa8",
          "body": null,
          "is_bot": false,
          "headline": "feat: prompt to add kanban directory to .gitignore",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-22T14:15:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7acda104c78f10190671d55e70b7457c53d64587",
          "body": null,
          "is_bot": false,
          "headline": "fix: handle ctrl+h in create backspace",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-22T14:12:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4a01bdc32183d7c0f31bb5d605ac71aa6952a6e",
          "body": "- restore existing wrapTitle and wrapTitle2 table-driven tests removed during hotfix iteration\\n- add a noLineLimit wrapTitle case to guard against unbounded preallocation regressions",
          "is_bot": false,
          "headline": "test: restore wrapTitle coverage and add noLineLimit case",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-21T12:04:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7f9558fcc358a792e9bbddc7a47989544605e058",
          "body": "- avoid huge slice preallocation when wrapTitle is called with noLineLimit\\n- reuse bounded wrap-line capacity for wrapTitle and wrapTitle2\\n- add regression tests for noLineLimit wrapping behavior\\n- document CI failure analysis in a research report",
          "is_bot": false,
          "headline": "fix: prevent OOM in TUI title wrapping",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-21T12:01:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fa96c1012e426ab8edb3e72663562a931572de15",
          "body": "- add cursor-aware editing for create/edit wizard text fields (title/body/tags)\\n- support left/right/home/end navigation plus backspace/delete at cursor\\n- render the cursor at its actual position instead of always at the end\\n- add a failing-first test for mid-string insertion and document behavior in README\\n- record implementation notes in a research report",
          "is_bot": false,
          "headline": "fix: improve TUI create/edit text input editing",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-21T11:53:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "966f098ba8d031396e68ac42d4d1f219b02b8e8c",
          "body": "- add tui.hide_empty_columns config key and expose it via config get/set\\n- add tui runtime overrides with --hide-empty-columns and --show-empty-columns flags\\n- update TUI board rendering to hide empty columns with an empty-board fallback\\n- bump config schema to v10 with v9->v10 migration and new compat v9 fixture/tests\\n- update README and add research report for implementation details",
          "is_bot": false,
          "headline": "feat: add hide-empty-columns support in TUI",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-21T11:47:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "743b6c62c22e1cfd7a43b28b039ccbda66a1fc94",
          "body": "- add an e:edit shortcut that opens the same 4-step title/body/priority/tags flow used by create\\n- prefill edit fields from the selected task and save updates on Enter, including filename rename when title changes\\n- add focused TUI edit tests and refresh golden snapshots for status bar/help output changes\\n- update README keyboard shortcuts and document implementation research in docs/research",
          "is_bot": false,
          "headline": "feat: add TUI edit wizard flow",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-21T11:36:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cde14708b539b56f832fc30a9baee9aed968d04",
          "body": "Long titles in the detail view were rendered as a single line and clipped\nat the terminal edge. Now wrapTitle() is applied to the 'Task #N: Title'\nheader so it flows naturally across multiple lines within the terminal\nwidth, matching how the body already behaves.\n\nThe separator width is capped at terminal width so it never overflows.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: wrap long task titles in TUI detail view",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-20T11:18:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6b148e4ca788b5a9becde65d09687c86666d6d92",
          "body": "When an agent tries to edit/move/delete a task already claimed by the same\nagent (without re-passing --claim), the error message now suggests the exact\ncommand to recover: 'If this is you, add: --claim <name>'. This replaces the\nmisleading 'Use edit --release to release' suggestion, which told agent\n[…]\nThe fix is in ValidateTaskClaimed() in internal/task/validate.go which is the\nsingle point called by edit, move, and delete via CheckClaim().\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: improve claimed-by-self error message to suggest --claim flag",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-20T11:12:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f0243f0a75ddc9b05e52b218c9369ded1dbc5f8d",
          "body": "Bump version comment and refine defer-to-user boundary language to clarify ENV variables and emphasize that decisions must have no clear winner.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(skill): update installed kanban-based-development skill to v0.31.0",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-20T11:09:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a72e136fea016ab3c7ae6308469b16bb34a13d57",
          "body": "…ing commands\n\nSame changes as the installed skill: add Agent Cheatsheet section, add missing command docs (agent-name, pick, handoff, context), update edit/move/create signatures to reflect claim, release, append-body, and multi-ID support, and expand Decision Tree.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skill): update embedded kanban-md skill with cheatsheet and miss…",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-20T11:08:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2580f8c95db3d6e48744629b3f92dc750fd5c635",
          "body": "…kill\n\nAdd a dedicated Agent Cheatsheet section with combination commands covering the full task lifecycle: session start, atomic pick+move, create+claim, progress notes, handoff, and resume patterns. Also add missing command docs for agent-name, pick, handoff, and context, and update edit/move/create signatures to reflect claim, release, append-body, and multi-ID support added in v0.31.0. Update version comment to 0.31.0.\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(skill): add agent cheatsheet and missing commands to kanban-md s…",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-20T11:06:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "38eef9e612f3e0d4f8e7c3771575812491893ffd",
          "body": "Address new warnings from updated linter: G115 integer overflow for uintptr→int casts, G101 false positive on test data, G602 slice bounds, G204 subprocess with variable, QF1012 fmt.Fprintf preference, and remove stale nolint directives.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve lint issues with golangci-lint v2.10.1",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-19T13:47:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f26f4ea232cbde6ac3553b499d283537c5f2deb8",
          "body": "Allow claiming a task at creation time with `create --claim <name>`, enabling a single-command workflow to create and claim a task. Also update the CLAIM_REQUIRED error message to mention the `agent-name` command for generating a claim name.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add --claim flag to create command and improve claim error message",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-19T13:42:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "484c9755f5f937fe284cf8461fb68d04483fc0b2",
          "body": "…instructions\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add unique codename and autonomous versioning rules to release …",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-15T10:42:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5225ca2c1a2a40aafa860ae49a668a005cc5d3bc",
          "body": "Add ignore-string-values to goconst config for OS platform names and priority values that are intentionally used as string literals in tests. Remove stale nolint directives.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve goconst lint failures on Windows CI",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-15T10:37:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c17d3d33c7032ef9a074005204945199af324b16",
          "body": "…very step\n\nSimplify the TUI task creation wizard to use the same controls at every stage:\n- Tab always advances to next step\n- Enter always creates the task immediately\n- Shift+Tab always goes back\n- Esc always cancels\n\nRemoves Alt+Enter (no longer needed since Enter always creates). Simplifies the body step from multi-line textarea to single-line input for consistency. Users who need multi-line bodies can edit the task after creation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: consistent create wizard controls — tab:next, enter:create at e…",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-15T10:21:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9c73538f9fa79651d7ee17fa45fc4fff1fc62583",
          "body": "Add a hidden debug overlay accessible via Ctrl+D that shows:\n- Terminal dimensions (width x height)\n- Active column and row indices\n- Column count and total task count\n- Current column name, task count, and scroll offset\n- Selected task ID and title\n\nThe hotkey is intentionally not shown in the help bar or status bar.\nPress Ctrl+D, Esc, or q to dismiss.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add hidden debug screen to TUI (Ctrl+D)",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-14T13:45:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "03327cae5fe8c1f4d0faa6e2b1affb3b6b264705",
          "body": "Replace the single-step title-only create dialog with a 4-step wizard:\n1. Title (text input)\n2. Body (multi-line textarea with arrow key navigation)\n3. Priority (selection list with j/k navigation)\n4. Tags (comma-separated text input)\n\nNavigation: Enter advances to next step, Tab/Shift+Tab for forwa\n[…]\n4: Body\") and context-\nsensitive keyboard hints. All state is preserved when navigating between\nsteps, so going back doesn't lose entered data.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: multi-step task creation wizard in TUI",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-14T13:40:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ff800b1475987472874170837eb55478157826c6",
          "body": "Changed the status bar from `hjkl:nav` to `←↓↑→:nav` and flipped the help view to show arrow keys as primary (e.g. `←/h` instead of `h/←`). Arrow keys are more universally understood than vim keybindings.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: show arrow keys instead of hjkl in TUI status bar and help",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-14T13:18:00Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1c338b41e204686c1ed13300bcc46fffb0299386",
          "body": "Adds visual separation between the task content and the bottom help line (q/esc:back j/k:scroll) in the detail view. The viewport now reserves 2 lines at the bottom (blank separator + hint) instead of 1.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add blank line between content and help hint in TUI detail view",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-14T13:14:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a229bad7254f965532b268b9b133b03f96fd66ec",
          "body": "Two-line titles show more context in TUI cards without wasting space. Existing boards are migrated automatically (v8→v9) — configs with the old default of 1 are updated to 2. Users who prefer single-line titles can set `tui.title_lines: 1` in config.\n\n- Bumped config version to 9 with v8→v9 migration\n- Updated validation to allow title_lines=1 (min) through 3 (max)\n- Added v8 compat fixture and tests\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: change default title_lines from 1 to 2",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-14T13:10:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3dd907a91a3b7733fc9e160e88b13579f78c26cf",
          "body": "Changed the TUI keybindings for moving tasks to next/previous status from uppercase N/P to lowercase n/p. There's no reason to require Shift for these common operations — all other board-view keys are already lowercase.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: use lowercase n/p for move-next/move-prev in TUI",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-14T13:04:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e4ee384f2c106a475468f0d1060c5eee0cc6f1a4",
          "body": "LLMs naturally generate `--title` and `--description` flags when composing create commands. This adds both as first-class options:\n\n- `--title` as an alternative to the positional argument (errors if both provided)\n- `--description` as an alias for `--body` via flag normalization\n\nThis reduces wasted tool-call rounds when AI agents use kanban-md.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add --title and --description aliases to create command",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-14T13:00:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9a58ede1e1ad19c6f25ac26fc83130b4c26423bb",
          "body": "When a task file changes on disk while the detail view is open (e.g. an agent edits a task via CLI), the detail view now automatically refreshes to show the updated content. If the task file is deleted, the detail view closes and returns to the board.\n\n- Added refreshDetailTask() method called on every ReloadMsg\n- Looks up the detail task by ID in the freshly loaded tasks\n- Falls back to closing detail view if task is no longer visible\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: live-reload TUI detail view on file change",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-14T12:54:07Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ca86ea8268741dc50df674f90038896a8426d254",
          "body": "Adds `kanban-md agent-name` which generates random two-word names (e.g. \"quiet-storm\", \"frost-maple\") suitable for use with `--claim`. Uses the system dictionary (/usr/share/dict/words) when available, with a curated 200+ word embedded fallback list for systems without one. Output is plain text on s\n[…]\nge with crypto/rand-based word selection\n- Updated AGENTS.md, README.md, and skill files to use the new command instead of the raw awk pipeline\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add agent-name command for generating unique claim names",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-14T12:49:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3556494445413e74184137f9d2d8329b32600f53",
          "body": "…pearing (#174)\n\nAt small terminal heights, a single card plus indicators could exceed the available budget, causing the total output to overflow the terminal height and push column headers off-screen. Fix by clamping the board view from the bottom (keeping headers at the top) when it exceeds the target height.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: clamp TUI board view height to prevent column headers from disap…",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-13T18:42:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3f0abbbd48be165c0232e826f7a651c88d3fc471",
          "body": "Two fixes for text layout in the TUI:\n\n1. Glamour's word wrapper breaks at hyphens inside compound words (e.g. \"chunk-index-eval\"), creating short orphan fragments. Fix by temporarily replacing intra-word hyphens with non-breaking hyphens (U+2011) before rendering, then restoring them after.\n\n2. tru\n[…]\n and sliced by bytes which could corrupt multi-byte UTF-8 characters like →. Fix by using display width for measurements and rune-safe slicing.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: prevent orphan lines from hyphen wrapping in TUI detail view (#173)",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-13T18:36:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ee0ed3f00e4b6109447a635c275f58b6fd92f412",
          "body": "Pressing j past the end of content kept incrementing the stored scroll offset without clamping. Pressing k then required undoing all the overshoot before the view started moving. Fix by writing back the clamped offset in viewDetail() so subsequent key presses start from the correct position.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: clamp TUI detail view scroll offset at content bounds (#171)",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-13T18:27:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f7388e7ceb9079bcb1e8a89090d2b2dbdf076671",
          "body": "When an error was displayed, the status bar grew from 1 to 2 lines but the board padding used a fixed chrome height of 2, causing the total output to exceed the terminal height and pushing column headers off-screen. Fix by making chrome height dynamic via chromeHeight() which accounts for the error line.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: TUI error message no longer hides column header row (#165)",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-13T18:25:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a3b58c07e3b6092a037ffb961c90798062b598af",
          "body": "The ensureVisible() function computed visible card count at the old scroll offset, then adjusted the offset. At the new offset, different card heights and the up-indicator stealing a line could reduce the visible count, leaving the selected task off-screen. Fix by iterating until the scroll position stabilizes.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: TUI scroll now follows selected task off-screen (#164)",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-13T18:21:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c8ab3793c93a74c60264512cb8f63eacd19b6b40",
          "body": "Use charmbracelet/glamour to render task body as markdown in the detail\nview. Headers, bold, italic, code spans, code blocks, and bullet lists\nare now formatted. Single line breaks are preserved via\nWithPreservedNewLines so plain-text bodies render correctly.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add markdown rendering to TUI task detail view",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-11T12:25:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fa6736431c2e31cf3f4a799a0aeb24f8af0b71b4",
          "body": "Literal escape sequences (\\n, \\t, \\r, \\\\) set via CLI --body flags were\ndisplayed as-is. Add unescapeBody() to interpret them before rendering.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: render escape sequences in TUI task detail view",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-11T12:17:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1e6f26b736474026c35aad315facad5668c3300c",
          "body": "… in readme",
          "is_bot": false,
          "headline": "docs: add how to use section to readme; created TUI demo and inserted…",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-11T03:44:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e1e1134b7f91aae73f1e606e191427a55cc724d",
          "body": "chmod does not restrict file/directory permissions on Windows, causing 5 test failures. Add runtime.GOOS skip guards matching existing project patterns.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: skip chmod-based tests on Windows",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-10T21:34:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c4d91ac734b718d3291e5e47c1cd3f7ecfbed4dd",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'task/159-internal-small-gaps'",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-10T21:24:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "89dff2068c8e489804d43832f10e8a61d0e41cbf",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'task/158-tui-boundary-coverage'",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-10T21:24:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7ca31af2bd4b7ff0e3712550250c9351ad2e3ba7",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'task/155-skill-resolver-coverage'",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-10T21:24:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbfa9667cc59ed5c5f71e581f9fd71577001d10d",
          "body": "Add 33 boundary coverage tests for the TUI board component targeting previously uncovered code paths:\n\n- tickCmd: verify Init() returns a non-nil cmd and TickMsg produces follow-up tick\n- currentColumn: board with zero columns (nil statuses) exercises nil return path\n- indexOf: movePrev at first sta\n[…]\ne)\n- Navigation: arrow key aliases, nil task guards for N/P\n- Edge cases: backspace on empty create input, zero-width terminal, lenient parsing\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: cover internal/tui boundary and error cases",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-10T21:22:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f9e92007ff64dbbcb362a4664c3db7b7c1fdc670",
          "body": "Add targeted tests for uncovered code paths in config, task, board, and skill packages:\n\n- config: migrate() negative/future version, Load() future version and migration save error, IsTerminalStatus without archived status, FindDir root/symlink, Init save error, StatusShowDuration edge cases, Valida\n[…]\nedSkill basic test, GlobalPath non-empty, Install write-protected target, FindInstalledSkills partial, injectVersionComment minimal frontmatter\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: close small coverage gaps in internal packages",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-10T21:18:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e250cf8b2b0499e8fc5f6408ffdfe51b48ec0763",
          "body": "Add 48 tests in skill_coverage_test.go targeting resolveAgents, resolveSkills, relativePath, multiSelect, selectModel.Init, and related helpers.\n\nKey changes:\n- Extract isInteractiveFn and multiSelectFn as package-level function variables to enable mocking interactive code paths in tests\n- Test reso\n[…]\n resolveAgents: 26.1% -> 100%\n- resolveSkills: 65.2% -> 100%\n- multiSelect: 0% -> 100%\n- Init: 0% -> 100%\n- Overall cmd package: 88.8% -> 90.4%\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: cover cmd/skill.go resolver and helper functions",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-10T21:17:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09bf8c4ab784b3894647e167180dfdc415d6ac74",
          "body": "Add tests for all 5 functions in cmd/tui.go that were at 0% coverage:\n- isBoardNotFound: true for BoardNotFound code, false for other clierr codes, generic errors, and nil\n- offerInitTUI: accept via empty input (default), \"y\", \"yes\"; decline via \"n\" and arbitrary text\n- runTUI: non-BoardNotFound con\n[…]\nempty, preserves it when empty\n- startTUIWatcher: returns promptly on canceled context, returns promptly when watcher.New fails on invalid path\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: cover cmd/tui.go launcher functions",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-10T21:14:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0c8a891da51e011f60000a770df5ba34b58ee0b0",
          "body": "Add tests for moveSingleTask compact/idempotent output, runCreate\ncompact output and error paths (invalid deps, invalid status, WIP,\nwrite error), clearScreen ANSI output, watchBoard invalid path,\nrenderBoard warnings and read errors, and executeMove write/claim/\nWIP/resolve error paths.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: cover cmd/ move, create, and board sub-function gaps",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-10T21:09:06Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "caa05d5f9070dc444288121bdf42c7e6e442ffce",
          "body": "Add tests for all uncovered branches in edit/delete pipelines:\n- applyEditChanges: flag errors, claim-only changes\n- executeEdit: read error, claim error, apply error, post-validation error, write error\n- validateEditClaim: require_claim with no claimant\n- validateEditPost: require_claim on status c\n[…]\n, non-TTY confirmation, JSON output, write error\n- executeDelete: read error\n- softDeleteAndLog: write error\n\nExtract \"in-progress\" constant to fix goconst lint.\n\ncmd/ package coverage: 84.5% → 85.8%.",
          "is_bot": false,
          "headline": "test: cover cmd/ edit and delete sub-function error paths",
          "author_name": "Sergey Antopolskiy",
          "author_login": "antopolskiy",
          "committed_at": "2026-02-10T18:52:43Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 49,
      "commits_last_year": 333,
      "latest_release_at": "2026-07-17T22:17:54Z",
      "latest_release_tag": "v0.36.1",
      "releases_from_tags": false,
      "days_since_last_push": 4,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 17.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/antopolskiy/kanban-md",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/antopolskiy/kanban-md",
          "is_deprecated": false,
          "latest_version": "v0.36.1",
          "repository_url": "https://github.com/antopolskiy/kanban-md",
          "versions_count": 66,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-17T22:11:57Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 22,
      "stars": 171,
      "watchers": 3,
      "fork_history": {
        "days": [
          {
            "date": "2026-02-10",
            "count": 1
          },
          {
            "date": "2026-02-11",
            "count": 1
          },
          {
            "date": "2026-02-15",
            "count": 1
          },
          {
            "date": "2026-02-22",
            "count": 1
          },
          {
            "date": "2026-02-24",
            "count": 2
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-07",
            "count": 1
          },
          {
            "date": "2026-03-22",
            "count": 1
          },
          {
            "date": "2026-04-04",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 1
          },
          {
            "date": "2026-04-23",
            "count": 1
          },
          {
            "date": "2026-05-20",
            "count": 1
          },
          {
            "date": "2026-05-28",
            "count": 1
          },
          {
            "date": "2026-05-29",
            "count": 1
          },
          {
            "date": "2026-06-08",
            "count": 1
          },
          {
            "date": "2026-06-18",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 1
          },
          {
            "date": "2026-07-08",
            "count": 2
          },
          {
            "date": "2026-07-11",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 22,
        "total_forks": 22
      },
      "star_history": {
        "days": [
          {
            "date": "2026-02-10",
            "count": 43
          },
          {
            "date": "2026-02-11",
            "count": 11
          },
          {
            "date": "2026-02-12",
            "count": 7
          },
          {
            "date": "2026-02-14",
            "count": 1
          },
          {
            "date": "2026-02-15",
            "count": 2
          },
          {
            "date": "2026-02-16",
            "count": 5
          },
          {
            "date": "2026-02-17",
            "count": 1
          },
          {
            "date": "2026-02-19",
            "count": 2
          },
          {
            "date": "2026-02-22",
            "count": 3
          },
          {
            "date": "2026-02-24",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-04",
            "count": 1
          },
          {
            "date": "2026-03-05",
            "count": 1
          },
          {
            "date": "2026-03-07",
            "count": 1
          },
          {
            "date": "2026-03-09",
            "count": 2
          },
          {
            "date": "2026-03-13",
            "count": 3
          },
          {
            "date": "2026-03-15",
            "count": 3
          },
          {
            "date": "2026-03-18",
            "count": 1
          },
          {
            "date": "2026-03-20",
            "count": 2
          },
          {
            "date": "2026-03-22",
            "count": 1
          },
          {
            "date": "2026-03-23",
            "count": 1
          },
          {
            "date": "2026-03-24",
            "count": 1
          },
          {
            "date": "2026-03-27",
            "count": 2
          },
          {
            "date": "2026-04-02",
            "count": 1
          },
          {
            "date": "2026-04-03",
            "count": 1
          },
          {
            "date": "2026-04-04",
            "count": 3
          },
          {
            "date": "2026-04-05",
            "count": 1
          },
          {
            "date": "2026-04-06",
            "count": 2
          },
          {
            "date": "2026-04-11",
            "count": 2
          },
          {
            "date": "2026-04-12",
            "count": 1
          },
          {
            "date": "2026-04-16",
            "count": 2
          },
          {
            "date": "2026-04-17",
            "count": 1
          },
          {
            "date": "2026-04-18",
            "count": 1
          },
          {
            "date": "2026-04-19",
            "count": 2
          },
          {
            "date": "2026-04-20",
            "count": 1
          },
          {
            "date": "2026-04-21",
            "count": 1
          },
          {
            "date": "2026-04-22",
            "count": 2
          },
          {
            "date": "2026-04-24",
            "count": 1
          },
          {
            "date": "2026-04-27",
            "count": 1
          },
          {
            "date": "2026-04-29",
            "count": 1
          },
          {
            "date": "2026-05-01",
            "count": 1
          },
          {
            "date": "2026-05-02",
            "count": 1
          },
          {
            "date": "2026-05-05",
            "count": 1
          },
          {
            "date": "2026-05-07",
            "count": 1
          },
          {
            "date": "2026-05-11",
            "count": 2
          },
          {
            "date": "2026-05-13",
            "count": 1
          },
          {
            "date": "2026-05-14",
            "count": 2
          },
          {
            "date": "2026-05-16",
            "count": 1
          },
          {
            "date": "2026-05-18",
            "count": 2
          },
          {
            "date": "2026-05-25",
            "count": 2
          },
          {
            "date": "2026-05-26",
            "count": 1
          },
          {
            "date": "2026-05-29",
            "count": 2
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-06-01",
            "count": 2
          },
          {
            "date": "2026-06-06",
            "count": 1
          },
          {
            "date": "2026-06-12",
            "count": 2
          },
          {
            "date": "2026-06-14",
            "count": 1
          },
          {
            "date": "2026-06-15",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-06-25",
            "count": 1
          },
          {
            "date": "2026-06-28",
            "count": 1
          },
          {
            "date": "2026-06-30",
            "count": 2
          },
          {
            "date": "2026-07-01",
            "count": 3
          },
          {
            "date": "2026-07-02",
            "count": 1
          },
          {
            "date": "2026-07-04",
            "count": 2
          },
          {
            "date": "2026-07-07",
            "count": 2
          },
          {
            "date": "2026-07-08",
            "count": 2
          },
          {
            "date": "2026-07-12",
            "count": 1
          },
          {
            "date": "2026-07-17",
            "count": 2
          },
          {
            "date": "2026-07-18",
            "count": 4
          },
          {
            "date": "2026-07-20",
            "count": 2
          },
          {
            "date": "2026-07-21",
            "count": 1
          },
          {
            "date": "2026-07-22",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 171,
        "total_stars": 171
      },
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 71244,
      "source_files_sampled": 174,
      "oversized_source_files": 2,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "GEMINI.md"
      ],
      "agent_instruction_max_bytes": 14023
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/charmbracelet/bubbles",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.21.1"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/glamour",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.10.0"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.1-0.20250404203927-76690c660834"
        },
        {
          "name": "github.com/creack/pty",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.24"
        },
        {
          "name": "github.com/fsnotify/fsnotify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.9.0"
        },
        {
          "name": "github.com/muesli/termenv",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.16.0"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.10.2"
        },
        {
          "name": "github.com/spf13/pflag",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.10"
        },
        {
          "name": "go.yaml.in/yaml/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.4"
        },
        {
          "name": "golang.org/x/sys",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.40.0"
        },
        {
          "name": "golang.org/x/term",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.39.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 3,
        "open_issues": 1,
        "closed_ratio": 0.857,
        "closed_issues": 6,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "antopolskiy",
          "commits": 323,
          "avatar_url": "https://avatars.githubusercontent.com/u/23148726?v=4"
        },
        {
          "type": "User",
          "login": "vibbix",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/1731900?v=4"
        },
        {
          "type": "User",
          "login": "kaijen",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/4299353?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.97
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "build.yml",
        "pages.yml",
        "release.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 5,
            "reason": "1 out of 2 merged PRs checked by a CI test -- score normalized to 5",
            "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 1/19 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": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 10,
            "reason": "project is 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": 10,
            "reason": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 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": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "15 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "3866c357ff888a4b593603189dc7d3cde3dce302",
        "ran_at": "2026-07-22T04:50:34Z",
        "aggregate_score": 4.5,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T22:17:33Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-17T21:57:42Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 11,
          "created_at": "2026-07-18T08:50:15Z",
          "last_comment_at": "2026-07-18T13:36:12Z",
          "last_comment_author": "antopolskiy"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/antopolskiy/kanban-md",
    "host": "github.com",
    "name": "kanban-md",
    "owner": "antopolskiy"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 63,
      "inputs": {
        "security": 45,
        "vitality": 78,
        "community": 49,
        "governance": 58,
        "engineering": 78
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 78,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "commits_last_year": 333,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 8
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "333 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 333
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 49,
              "latest_release_tag": "v0.36.1",
              "releases_from_tags": false,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 17.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "49 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 49
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~17.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 17.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": "at_risk",
        "name": "Community & Adoption",
        "value": 49,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 49,
            "inputs": {
              "forks": 22,
              "stars": 171,
              "watchers": 3,
              "growth_state": "organic",
              "growth_factor_pct": 100
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "171 stars",
                "points": 36.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 171
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "22 forks",
                "points": 11,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 22
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "3 watchers",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": 58,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.97
            },
            "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 97% of commits",
                "points": 0.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 97
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 69,
            "inputs": {
              "merged_prs": 3,
              "open_issues": 1,
              "closed_issues": 6,
              "issue_closed_ratio": 0.857,
              "closed_unmerged_prs": 1
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "86% of issues closed",
                "points": 40.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 86
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "3/4 decided PRs merged",
                "points": 28.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 3,
                      "decided": 4
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/19 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "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": 57,
            "inputs": {
              "followers": 43,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "antopolskiy",
              "public_repos": 43,
              "account_age_days": 3551
            },
            "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": "43 followers of antopolskiy",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 43,
                      "login": "antopolskiy"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "43 public repos, account ~9 yr old",
                "points": 24,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 43
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 9
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/antopolskiy/kanban-md"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "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 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "66 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 66
                    }
                  }
                ],
                "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": 78,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 74,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "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": "1 out of 2 merged PRs checked by a CI test -- score normalized to 5",
                "points": 10,
                "status": "partial",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "topics": [
                "ai-agents",
                "cli",
                "developer-tools",
                "go",
                "kanban",
                "markdown",
                "project-management",
                "task-management",
                "terminal",
                "tui",
                "agent-skills",
                "multi-agent",
                "agent-loops",
                "loops"
              ],
              "has_wiki": true,
              "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": "14 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 14
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 45,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 45,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 4.5
            },
            "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 not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "1 out of 2 merged PRs checked by a CI test -- score normalized to 5",
                "points": 1.2,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 1/19 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": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is fuzzed",
                "points": 5,
                "status": "met",
                "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": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "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": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "15 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 4
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "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": "excellent",
        "name": "AI Readiness",
        "value": 86,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.87,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "GEMINI.md"
              ],
              "agent_instruction_max_bytes": 14023
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, GEMINI.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, GEMINI.md"
                    }
                  }
                ],
                "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": "87 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 87,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 82,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.39,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "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": "39 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 39,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 99,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 71244,
              "source_files_sampled": 174,
              "oversized_source_files": 2
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "2/174 source files over 60KB",
                "points": 54.4,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 174,
                      "oversized": 2
                    }
                  }
                ],
                "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-22T04:50:45.577880Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/antopolskiy/kanban-md.svg",
  "full_name": "antopolskiy/kanban-md",
  "license_state": "standard",
  "license_spdx": "MIT"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.26.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsGo.