Öffentliches Register
Software-GesundheitsberichtSchema 0.26.0 · Metriken 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 Sterne⑂ 22 Forksseit Feb. 2026Auf GitHub ansehen ↗

antopolskiy/kanban-md erreicht einen Gesundheitsindex von 63 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei AI Readiness (86/100) ab, am schwächsten bei Security (45/100). Zuletzt vor 4 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

63
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

63
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

Sergey AntopolskiyPersönliches Konto
43 Follower43 öffentliche Reposseit Okt. 2016MosaiQLabs

Dieses Repository gehört einem persönlichen Konto. Ein Projekt mit nur einem Eigentümer trägt ein höheres Kontinuitätsrisiko als ein organisationsgetragenes.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
Gogithub.com/antopolskiy/kanban-mdv0.36.1-66vor 4 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

78Gut · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 4 Tagen
5.5/36Commit-Rhythmus — 8/52 Wochen mit Commits
18/18Commit-Volumen — 333 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year333
human_commit_share1
days_since_last_push4
active_weeks_last_year8
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 49 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 4 Tagen
27/27Release-Rhythmus — ein Release etwa alle 17,4 Tage
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Verwendete Eingangsdaten
releases_count49
latest_release_tagv0.36.1
releases_from_tagsnein
days_since_latest_release4
mean_days_between_releases17,4

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

49Gefährdet · 18 % des Gesamtindex
Wie die Bewertung erfolgt
36.2/60Stars — 171 Stars
11/25Forks — 22 Forks
1.7/15Watcher — 3 Watcher
Verwendete Eingangsdaten
forks22
stars171
watchers3
growth_stateorganic
growth_factor_pct100
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (MIT)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

58Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
0.7/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 97 % der Commits
4.1/13.5Breite der Beitragenden — 3 Beitragende
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Verwendete Eingangsdaten
bus_factor1
contributors_sampled3
top_contributor_share0,97
Wie die Bewertung erfolgt
40.1/46.8Issue-Lösungsquote — 86 % der Issues geschlossen
28.7/38.3PR-Annahme — 3/4 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 1/19 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs3
open_issues1
closed_issues6
issue_closed_ratio0,857
closed_unmerged_prs1
Wie die Bewertung erfolgt
10/30Organisatorische Trägerschaft — persönliches (Nutzer-)Konto
0/20Verifizierte Domain — für Nutzerkonten nicht anwendbar
11.8/25Reichweite des Inhabers — 43 Follower von antopolskiy
24/25Kontohistorie — 43 öffentliche Repos, Kontoalter ca. 9 Jahre
Verwendete Eingangsdaten
followers43
owner_typeUser
is_verified
owner_loginantopolskiy
public_repos43
account_age_days3.551
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Verifizierte Domain. Die verbleibenden Gewichte wurden renormalisiert.

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf go
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 4 Tagen
20/20Versionshistorie — 66 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesgithub.com/antopolskiy/kanban-md
ecosystemsgo
any_deprecatednein
min_days_since_publish4

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

78Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 3 Workflow(s)
24/24Tests vorhanden
16/16Linter-Konfiguration — .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
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_configja
has_precommit_confignein

Dokumentation

85Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
10/10Repository-Beschreibung
10/10Topics — 14 Topics
10/10Wiki
Verwendete Eingangsdaten
topicsai-agents, cli, developer-tools, go, kanban, markdown, project-management, task-management, terminal, tui, agent-skills, multi-agent, agent-loops, loops
has_wikija
homepage
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

45Gefährdet · 16 % des Gesamtindex

Sicherheitslage

45Gefährdet
Wie die Bewertung erfolgt
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.5Lizenz — 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
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4,5

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

86Exzellent · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — AGENTS.md, CLAUDE.md, GEMINI.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 87 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,87
agent_instruction_filesAGENTS.md, CLAUDE.md, GEMINI.md
agent_instruction_max_bytes14.023
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — Makefile
22/22Automatisierte Tests
11/11Lint-/Format-Konfiguration — .golangci.yml
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — lockfile
10/10Belegte Agentenpraxis — 39 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesgo.sum
has_dockerfilenein
typed_languageja
bootstrap_filesMakefile
has_devcontainernein
has_linter_configja
typecheck_configs
agent_commit_share0,39
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
54.4/55Handhabbare Dateigrößen — 2/174 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes71.244
source_files_sampled174
oversized_source_files2

Eckdaten

171GitHub-Sterne
3Mitwirkende
333Commits, letzte 12 Monate
4Tage seit letztem Push
49Releases
1Bus-Faktor
1offene Issues
GoPaket-Ökosysteme

Warnungen zur Datenerhebung

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

Weitere Details

Stern- und Fork-Verlauf 171 ★ / 22 ⇿
171Sterne
22Forks
15Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

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

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).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
Direkte Abhängigkeiten 12
RegistryPaketVersionsvorgabeManifest
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
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

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

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.26.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenGo.