Registro público
Informe de salud del softwareesquema 0.26.0 · métricas 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 estrellas⑂ 22 forksdesde feb 2026Ver en GitHub ↗

antopolskiy/kanban-md tiene un índice de salud de 63 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (86/100) y la más baja, Security (45/100). Se actualizó por última vez hace 4 días. Una sola persona concentra la mayor parte del trabajo reciente.

63
global / 100
Moderado

Índice de salud del software

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

63
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

Sergey AntopolskiyCuenta personal
43 seguidores43 repositorios públicosdesde oct 2016MosaiQLabs

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
Gogithub.com/antopolskiy/kanban-mdv0.36.1-66hace 4 días

Métricas por categoría

Vitalidad

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

78Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 4 días
5.5/36Cadencia de commits — 8/52 semanas con commits
18/18Volumen de commits — 333 commits en el último año
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Datos de entrada utilizados
commits_last_year333
human_commit_share1
days_since_last_push4
active_weeks_last_year8
Cómo se puntúa
27/27Publica versiones — 49 versiones publicadas
36/36Recencia de las versiones — última versión hace 4 días
27/27Cadencia de publicación — una versión cada ~17,4 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count49
latest_release_tagv0.36.1
releases_from_tagsno
days_since_latest_release4
mean_days_between_releases17,4

Comunidad y Adopción

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

49En riesgo · 18% del índice global
Cómo se puntúa
36.2/60Estrellas — 171 estrellas
11/25Forks — 22 forks
1.7/15Observadores — 3 observadores
Datos de entrada utilizados
forks22
stars171
watchers3
growth_stateorganic
growth_factor_pct100
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

58Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.7/22.5Distribución de commits — el principal contribuyente firma el 97% de los commits
4.1/13.5Amplitud de contribuyentes — 3 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled3
top_contributor_share0,97
Cómo se puntúa
40.1/46.8Resolución de issues — 86% de issues cerradas
28.7/38.3Aceptación de PR — 3/4 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 1/19 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs3
open_issues1
closed_issues6
issue_closed_ratio0,857
closed_unmerged_prs1
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
11.8/25Alcance del propietario — 43 seguidores de antopolskiy
24/25Trayectoria — 43 repos públicos, cuenta de ~9 años
Datos de entrada utilizados
followers43
owner_typeUser
is_verified
owner_loginantopolskiy
public_repos43
account_age_days3551
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en go
35/35Recencia de publicación — última publicación hace 4 días
20/20Historial de versiones — 66 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/antopolskiy/kanban-md
ecosystemsgo
any_deprecatedno
min_days_since_publish4

Calidad de Ingeniería

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

78Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 3 flujo(s) de trabajo
24/24Pruebas presentes
16/16Configuración de linter — .golangci.yml
0/9.6Hooks de pre-commit
0/6.4.editorconfig
10/20OpenSSF Scorecard: CI-Tests — 1 out of 2 merged PRs checked by a CI test -- score normalized to 5
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_config
has_precommit_configno

Documentación

85Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
10/10Topics — 14 topics
10/10Wiki
Datos de entrada utilizados
topicsai-agents, cli, developer-tools, go, kanban, markdown, project-management, task-management, terminal, tui, agent-skills, multi-agent, agent-loops, loops
has_wiki
homepage
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

45En riesgo · 16% del índice global
Cómo se puntúa
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.5Licencia — 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
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate4,5

Preparación para IA

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

86Excelente · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md, GEMINI.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 87 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,87
agent_instruction_filesAGENTS.md, CLAUDE.md, GEMINI.md
agent_instruction_max_bytes14.023
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
11/11Configuración de lint / formato — .golangci.yml
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 39 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfilesgo.sum
has_dockerfileno
typed_language
bootstrap_filesMakefile
has_devcontainerno
has_linter_config
typecheck_configs
agent_commit_share0,39
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
54.4/55Tamaños de archivo manejables — 2/174 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes71.244
source_files_sampled174
oversized_source_files2

Datos clave

171estrellas de GitHub
3contribuidores
333commits en los últimos 12 meses
4días desde el último push
49versiones publicadas
1factor bus
1issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

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

Más detalle

Historial de estrellas y forks 171 ★ / 22 ⇿
171Estrellas
22Forks
15Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

0408012016020017122432026-022026-052026-07
Mayor 0Menor 6Parche 9
OpenSSF Scorecard 4.5 / 10
4.5agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-22 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
Dependencias directas 12
RegistroPaqueteRestricción de versiónManifiesto
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
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.26.0 — metodología completa · wiki de métricas.

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