Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 02:19 UTC

TechDufus / openkanban

TUI kanban board for orchestrating AI coding agents

GoAGPL-3.0★ 126 estrellas⑂ 15 forksdesde dic 2025Ver en GitHub ↗

TechDufus/openkanban tiene un índice de salud de 57 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (76/100) y la más baja, Community & Adoption (47/100). Se actualizó por última vez hace 40 días. Una sola persona concentra la mayor parte del trabajo reciente.

57
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.

57
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

Matthew DeGarmoCuenta personal
180 seguidores82 repositorios públicosdesde ene 2019@Raft-Tech

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/techdufus/openkanbanv0.1.1-42hace 40 días

Métricas por categoría

Vitalidad

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

61Moderado · 22% del índice global
Cómo se puntúa
18/36Recencia de push — último push hace 40 días
4.8/36Cadencia de commits — 7/52 semanas con commits
18/18Volumen de commits — 118 commits en el último año
0/10OpenSSF Scorecard: Maintained — 1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Datos de entrada utilizados
commits_last_year118
human_commit_share1
days_since_last_push40
active_weeks_last_year7
Cómo se puntúa
27/27Publica versiones — 39 versiones publicadas
36/36Recencia de las versiones — última versión hace 40 días
27/27Cadencia de publicación — una versión cada ~16,7 días
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Datos de entrada utilizados
releases_count39
latest_release_tagv0.1.1
releases_from_tagsno
days_since_latest_release40
mean_days_between_releases16,7

Comunidad y Adopción

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

47En riesgo · 18% del índice global
Cómo se puntúa
34/60Estrellas — 126 estrellas
9.6/25Forks — 15 forks
0/15Observadores — 1 observadores
Datos de entrada utilizados
forks15
stars126
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (AGPL-3.0)
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?

60Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
43.2/46.8Resolución de issues — 92% de issues cerradas
35.2/38.3Aceptación de PR — 46/50 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs46
open_issues4
closed_issues48
issue_closed_ratio0,923
closed_unmerged_prs4
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
16.2/25Alcance del propietario — 180 seguidores de TechDufus
25/25Trayectoria — 82 repos públicos, cuenta de ~7 años
Datos de entrada utilizados
followers180
owner_typeUser
is_verified
owner_loginTechDufus
public_repos82
account_age_days2745
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 40 días
20/20Historial de versiones — 42 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesgithub.com/techdufus/openkanban
ecosystemsgo
any_deprecatedno
min_days_since_publish40

Calidad de Ingeniería

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

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

Documentación

65Moderado
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
0/10Topics
0/10Wiki
Datos de entrada utilizados
topics
has_wikino
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?

48En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
2.2/7.5Branch-Protection — branch protection is not maximal on development and all release branches
2.5/2.5CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 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
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — 1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
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.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,5
Cómo se puntúa
35/35Dependencias directas libres de avisos conocidos — ninguna dependencia directa tiene un aviso conocido
0/25Dependencias indirectas libres de avisos conocidos — el conjunto transitivo no es separable de las dependencias de desarrollo y prueba en este alcance
0/40Sin avisos pendientes — ningún aviso tiene fecha de publicación
Datos de entrada utilizados
sourceosv
advisories2
affected_packages2
assessed_packages28
unassessed_packages0
affected_by_severityunknown 2
direct_affected_packages0
Excluidos de la puntuación (sin datos o no aplicable): Dependencias indirectas libres de avisos conocidos, Sin avisos pendientes. Los pesos restantes se han renormalizado. Se cotejaron 28 dependencias resueltas con OSV. Este repositorio no publica ningún paquete que el índice resuelva, por lo que se evaluó en su lugar el grafo de dependencias del repositorio. Ese grafo mezcla fijaciones de desarrollo y prueba con las dependencias distribuidas, de modo que solo se puntúan las dependencias declaradas en tiempo de ejecución; los hallazgos transitivos se informan como contexto y quedan excluidos de la puntuación. No se analiza la alcanzabilidad.

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.

76Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — AGENTS.md, CLAUDE.md, internal/CLAUDE.md, internal/agent/CLAUDE.md, internal/terminal/CLAUDE.md, internal/ui/AGENTS.md, internal/ui/CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 99 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,99
agent_instruction_filesAGENTS.md, CLAUDE.md, internal/CLAUDE.md, internal/agent/CLAUDE.md, internal/terminal/CLAUDE.md, internal/ui/AGENTS.md, internal/ui/CLAUDE.md
agent_instruction_max_bytes6758
Cómo se puntúa
18/18Arranque con un solo comando — Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — Go (tipado estático)
10/10Entorno reproducible — lockfile
0/10Práctica demostrada con agentes — ningún commit con autoría de agente entre los últimos 100
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_configno
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — Go (tipado estático)
53.6/55Tamaños de archivo manejables — 1/38 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageGo
largest_source_bytes71.366
source_files_sampled38
oversized_source_files1

Datos clave

126estrellas de GitHub
1contribuidores
118commits en los últimos 12 meses
40días desde el último push
39versiones publicadas
1factor bus
4issues abiertas
Goecosistemas de paquetes

Advertencias de recopilación de datos

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Más detalle

Historial de estrellas y forks 0 ★ / 15 ⇿
0Estrellas
15Forks
16Versiones

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.

03581013151422026-012026-032026-06
Mayor 0Menor 1Parche 15
OpenSSF Scorecard 3.5 / 10
3.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-23 02:19 UTC

10Binary-Artifactsno binaries found in the repo
3Branch-Protectionbranch protection is not maximal on development and all release branches
10CI-Tests22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 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
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintained1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
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.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
Dependencias directas 7
RegistroPaqueteRestricción de versiónManifiesto
Gogithub.com/charmbracelet/bubblesv0.21.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.4go.mod
Gogithub.com/charmbracelet/lipglossv1.1.0go.mod
Gogithub.com/creack/ptyv1.1.24go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogithub.com/hinshun/vt10xv0.0.0-20220301184237-5011da428d02go.mod
Gogithub.com/spf13/cobrav1.8.1go.mod
Todas las dependencias 28

Conjunto completo de dependencias resueltas según el grafo de dependencias de GitHub: 7 paquetes directos y 21 indirectos (transitivos). El cierre transitivo es completo cuando el repositorio incluye un lockfile.

RegistroPaqueteVersiónRelación
Gogithub.com/charmbracelet/bubblesv0.21.0directa
Gogithub.com/charmbracelet/bubbleteav1.3.4directa
Gogithub.com/charmbracelet/lipglossv1.1.0directa
Gogithub.com/creack/ptyv1.1.24directa
Gogithub.com/google/uuidv1.6.0directa
Gogithub.com/hinshun/vt10xv0.0.0-20220301184237-5011da428d02directa
Gogithub.com/spf13/cobrav1.8.1directa
Gogithub.com/atotto/clipboardv0.1.4indirecta
Gogithub.com/aymanbagabas/go-osc52/v2v2.0.1indirecta
Gogithub.com/charmbracelet/colorprofilev0.2.3-0.20250311203215-f60798e515dcindirecta
Gogithub.com/charmbracelet/x/ansiv0.8.0indirecta
Gogithub.com/charmbracelet/x/cellbufv0.0.13-0.20250311204145-2c3ea96c31ddindirecta
Gogithub.com/charmbracelet/x/termv0.2.1indirecta
Gogithub.com/erikgeiser/coninputv0.0.0-20211004153227-1c3628e74d0findirecta
Gogithub.com/inconshreveable/mousetrapv1.1.0indirecta
Gogithub.com/lucasb-eyer/go-colorfulv1.2.0indirecta
Gogithub.com/mattn/go-isattyv0.0.20indirecta
Gogithub.com/mattn/go-localereaderv0.0.1indirecta
Gogithub.com/mattn/go-runewidthv0.0.16indirecta
Gogithub.com/muesli/ansiv0.0.0-20230316100256-276c6243b2f6indirecta
Gogithub.com/muesli/cancelreaderv0.2.2indirecta
Gogithub.com/muesli/termenvv0.16.0indirecta
Gogithub.com/rivo/unisegv0.4.7indirecta
Gogithub.com/spf13/pflagv1.0.5indirecta
Gogithub.com/xo/terminfov0.0.0-20220910002029-abceb7e1c41eindirecta
Gogolang.org/x/syncv0.11.0indirecta
Gogolang.org/x/sysv0.30.0indirecta
Gogolang.org/x/textv0.3.8indirecta
Avisos de dependencias 2

Este repositorio no publica ningún paquete que el índice resuelva, así que se evaluó su propio grafo de dependencias — 28 paquetes, que incluyen también fijaciones de desarrollo y prueba que nunca se distribuyen: 2 tienen avisos conocidos, de los cuales 0 son directas.

PaqueteVersiónRelaciónGravedadAvisosCorregido en
golang.org/x/sysv0.30.0indirectadesconocida10.44.0
golang.org/x/textv0.3.8indirectadesconocida10.39.0

Un aviso significa que la versión registrada en el grafo de dependencias cae dentro del rango afectado de un aviso. No se analiza la alcanzabilidad, y el grafo incluye fijaciones de desarrollo y prueba: un hallazgo puede referirse al utillaje y no al software distribuido.

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 5949,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Go": 349883,
        "Makefile": 1353
      },
      "pushed_at": "2026-06-12T16:49:41Z",
      "created_at": "2025-12-17T19:25:27Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T08:58:58Z",
      "description": "TUI kanban board for orchestrating AI coding agents",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "AGPL-3.0",
      "default_branch": "main",
      "license_spdx_raw": "AGPL-3.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": "https://techdufus.com",
      "name": "Matthew DeGarmo",
      "type": "User",
      "login": "TechDufus",
      "company": "@Raft-Tech",
      "location": "USA",
      "followers": 180,
      "avatar_url": "https://avatars.githubusercontent.com/u/46715299?v=4",
      "created_at": "2019-01-15T13:42:58Z",
      "is_verified": null,
      "public_repos": 82,
      "account_age_days": 2745
    },
    "license": {
      "state": "standard",
      "spdx_id": "AGPL-3.0",
      "raw_spdx": "AGPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-06-12T16:51:24Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-01-28T18:13:10Z"
        },
        {
          "tag": "v0.0.40",
          "kind": "patch",
          "published_at": "2026-01-28T17:36:56Z"
        },
        {
          "tag": "v0.0.39",
          "kind": "patch",
          "published_at": "2026-01-23T02:23:28Z"
        },
        {
          "tag": "v0.0.38",
          "kind": "patch",
          "published_at": "2026-01-22T22:44:45Z"
        },
        {
          "tag": "v0.0.37",
          "kind": "patch",
          "published_at": "2026-01-22T17:59:03Z"
        },
        {
          "tag": "v0.0.36",
          "kind": "patch",
          "published_at": "2026-01-13T09:49:27Z"
        },
        {
          "tag": "v0.0.35",
          "kind": "patch",
          "published_at": "2026-01-13T09:24:33Z"
        },
        {
          "tag": "v0.0.34",
          "kind": "patch",
          "published_at": "2026-01-13T09:12:05Z"
        },
        {
          "tag": "v0.0.33",
          "kind": "patch",
          "published_at": "2026-01-13T08:52:20Z"
        },
        {
          "tag": "v0.0.32",
          "kind": "patch",
          "published_at": "2026-01-13T08:49:30Z"
        },
        {
          "tag": "v0.0.31",
          "kind": "patch",
          "published_at": "2026-01-13T08:33:55Z"
        },
        {
          "tag": "v0.0.30",
          "kind": "patch",
          "published_at": "2026-01-13T08:07:47Z"
        },
        {
          "tag": "v0.0.29",
          "kind": "patch",
          "published_at": "2026-01-13T08:06:58Z"
        },
        {
          "tag": "v0.0.28",
          "kind": "patch",
          "published_at": "2026-01-13T07:47:09Z"
        },
        {
          "tag": "v0.0.27",
          "kind": "patch",
          "published_at": "2026-01-13T07:44:29Z"
        },
        {
          "tag": "v0.0.26",
          "kind": "patch",
          "published_at": "2026-01-13T04:41:21Z"
        },
        {
          "tag": "v0.0.25",
          "kind": "patch",
          "published_at": "2026-01-05T07:47:16Z"
        },
        {
          "tag": "v0.0.24",
          "kind": "patch",
          "published_at": "2026-01-05T07:42:16Z"
        },
        {
          "tag": "v0.0.23",
          "kind": "patch",
          "published_at": "2026-01-04T23:46:38Z"
        },
        {
          "tag": "v0.0.22",
          "kind": "patch",
          "published_at": "2026-01-04T23:17:58Z"
        },
        {
          "tag": "v0.0.21",
          "kind": "patch",
          "published_at": "2026-01-04T21:52:22Z"
        },
        {
          "tag": "v0.0.20",
          "kind": "patch",
          "published_at": "2026-01-04T21:24:03Z"
        },
        {
          "tag": "v0.0.19",
          "kind": "patch",
          "published_at": "2026-01-04T20:52:11Z"
        },
        {
          "tag": "v0.0.18",
          "kind": "patch",
          "published_at": "2026-01-04T03:32:11Z"
        },
        {
          "tag": "v0.0.17",
          "kind": "patch",
          "published_at": "2026-01-04T02:16:54Z"
        },
        {
          "tag": "v0.0.16",
          "kind": "patch",
          "published_at": "2026-01-04T00:42:03Z"
        },
        {
          "tag": "v0.0.15",
          "kind": "patch",
          "published_at": "2026-01-03T05:56:38Z"
        },
        {
          "tag": "v0.0.14",
          "kind": "patch",
          "published_at": "2026-01-03T05:16:59Z"
        },
        {
          "tag": "v0.0.13",
          "kind": "patch",
          "published_at": "2026-01-03T04:47:30Z"
        },
        {
          "tag": "v0.0.12",
          "kind": "patch",
          "published_at": "2026-01-03T04:38:00Z"
        },
        {
          "tag": "v0.0.11",
          "kind": "patch",
          "published_at": "2025-12-31T21:04:04Z"
        },
        {
          "tag": "v0.0.10",
          "kind": "patch",
          "published_at": "2025-12-31T20:15:47Z"
        },
        {
          "tag": "v0.0.9",
          "kind": "patch",
          "published_at": "2025-12-31T20:04:18Z"
        },
        {
          "tag": "v0.0.8",
          "kind": "patch",
          "published_at": "2025-12-31T14:58:53Z"
        },
        {
          "tag": "v0.0.6",
          "kind": "patch",
          "published_at": "2025-12-30T07:37:07Z"
        },
        {
          "tag": "v0.0.3",
          "kind": "patch",
          "published_at": "2025-12-30T04:23:51Z"
        },
        {
          "tag": "v0.0.2",
          "kind": "patch",
          "published_at": "2025-12-28T20:32:01Z"
        },
        {
          "tag": "v0.0.1",
          "kind": "patch",
          "published_at": "2025-12-28T02:55:23Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "02201ed231e37519541e9d92cd1e66316a7e97cb",
          "body": null,
          "is_bot": false,
          "headline": "fix(core): address project review defects",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2026-06-12T16:46:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df298ce7da5cc19974b82ddcf41f7720743409a9",
          "body": "Root CLAUDE.md provides project overview and where-to-look table.\nNested files in internal/, internal/ui/, internal/agent/, and\ninternal/terminal/ provide contextual guidance that loads automatically\nwhen Claude works in those directories.",
          "is_bot": false,
          "headline": "docs: add nested CLAUDE.md structure for progressive disclosure",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2026-01-28T18:46:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1053053124dbbf4c0fada0ea69c92a9a3122bfe8",
          "body": null,
          "is_bot": false,
          "headline": "docs: update for global-only DefaultAgent",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2026-01-28T18:11:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8a2cb19123af37c8501de5ff165c71d3ee7bfd75",
          "body": "DefaultAgent is now global-only. Per-project overrides were never\nexposed in the UI and existing values in projects.json are silently\nignored (Go unmarshals unknown fields without error).",
          "is_bot": false,
          "headline": "fix(settings): remove per-project DefaultAgent override",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2026-01-28T18:11:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "26371d400b0d31391c0b2b76f44a6f206ee1a39b",
          "body": "Move ticket storage from per-repo `.openkanban/tickets.json` to\ncentralized `~/.config/openkanban/tickets/{project_id}.json`.\n\nChanges:\n- Add ticketsDir() function returning config-based path\n- Add migration logic in LoadTicketStore() for existing tickets\n- Archive ticket files to `archived/` subdir\n[…]\nve tests\n- Update documentation with new storage locations\n\nMigration logs a warning directing users to delete old .openkanban\ndirectories manually. Archived tickets use timestamp suffix on\ncollision.",
          "is_bot": false,
          "headline": "refactor(project): centralize ticket storage in config directory",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2026-01-28T17:34:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1198aea36f636fec95cb8d8e309feb5e9483c918",
          "body": "Previously, when creating a project, global defaults (DefaultAgent,\nBranchPrefix) were eagerly copied into project settings. This \"baked in\"\nthe defaults at creation time, so changing global settings later had no\neffect on existing projects.\n\nChanges:\n- Remove eager-copy of global defaults in projec\n[…]\ny)\n2. Check global config default (if non-empty)\n3. Fall back to hardcoded default\n\nThis ensures that changing global defaults now affects all projects\nunless they have explicit per-project overrides.",
          "is_bot": false,
          "headline": "fix(settings): implement proper cascade for default settings (#101)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-23T02:21:34Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b8592666c6aedc0e9d7993ad9cc3bceb5abeb35a",
          "body": "Fixes codex CLI immediately exiting with \"Agent exited\" when spawned\nfrom OpenKanban tickets. Other agents (claude, aider) were unaffected.\n\n## The Bug\n\nCodex CLI would exit immediately after spawn with no visible output.\nDebug logging revealed the error:\n\n```\nError: The cursor position could not be\n[…]\neport): CSI 6n requests cursor position\n- CPR (Cursor Position Report): CSI row;col R is the response\n- vt10x library: github.com/hinshun/vt10x\n- vt10x DSR handling: vt10x/csi.go case 6 in handleCSI()",
          "is_bot": false,
          "headline": "fix(terminal): connect vt10x to PTY for escape sequence responses",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2026-01-22T22:42:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cf7dfae2ad90da8fee6b3e86350e2880b1119508",
          "body": "Implement terminal pane scrollback and selection functionality that\nallows users to scroll through agent terminal history and copy text.\n\nScrollback features:\n- Ring buffer storing up to 10,000 lines (configurable)\n- Mouse wheel scrolling when child process hasn't enabled mouse mode\n- Keyboard navig\n[…]\nen detection (vim/nano) disables scrollback capture\n- Resize clears selection and resets viewport\n- Mouse mode toggle clears selection\n\nNew files: scrollback.go, selection.go with comprehensive tests.",
          "is_bot": false,
          "headline": "feat(terminal): add scrollback buffer and text selection (#95)",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2026-01-22T17:57:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d846598806bbdcc290c9de0932504e9e26e51d13",
          "body": "* fix(terminal): block motion, always forward scroll\n\nMotion events (mouse movement) were leaking as X10 sequences causing\ngarbage text. Now explicitly blocks all motion events at entry.\n\n- Block MouseActionMotion events immediately\n- Always forward scroll wheel (apps handle internally)\n- Only forwa\n[…]\n\n- Block motion events immediately on entry\n- Block scroll wheel (no scrollback buffer exists)\n- Block button clicks unless app enables mouse tracking\n- Scrollback is a separate feature tracked in #95",
          "is_bot": false,
          "headline": "fix(terminal): block mouse events leaking to PTY (#100)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-13T09:47:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d87b7cebe8290c8d768b6d058d21b102586eb4a3",
          "body": "Agent statuses were persisted on tickets and loaded from disk, causing\ntickets to show 'working' status after app restart even with no agents\nrunning.\n\n- Reset all agent statuses to 'none' in NewModel() since there are no\n  active sessions at startup\n- Clean up stale status files when spawning new terminal sessions",
          "is_bot": false,
          "headline": "fix: reset agent statuses on app startup (#99)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-13T09:22:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bbc605b17feed873fc012e86fbdcee231684e38a",
          "body": "Motion events (mouse movement) were leaking as X10 sequences causing\ngarbage text. Now explicitly blocks all motion events at entry.\n\n- Block MouseActionMotion events immediately\n- Always forward scroll wheel (apps handle internally)\n- Only forward button press when mouseEnabled=true",
          "is_bot": false,
          "headline": "fix(terminal): block motion, always forward scroll (#98)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-13T09:10:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "adb555e918a9fb1e2a8e2bdb4cd8b90db2d1038d",
          "body": "* fix(terminal): prevent mouse events leaking to PTY\n\nHandleMouse was unconditionally forwarding all mouse events to the\nPTY as X10 escape sequences, even when the child process never\nrequested mouse tracking. This caused visible garbage text in apps\nthat don't enable mouse mode.\n\n- Add mouseEnabled\n[…]\nfunctionality.\n\n- Scroll wheel now sends cursor keys when mouse mode not enabled\n- Button clicks remain blocked to prevent X10 sequence garbage\n- Full X10 encoding preserved when mouse mode is enabled",
          "is_bot": false,
          "headline": "fix(terminal): restore scroll in terminal pane (#96)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-13T08:50:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bc90763e04ff6ff54bdff6e2bb7c97811de502ea",
          "body": "The opencode server was causing app crashes in several scenarios:\n- Hardcoded 5s timeout insufficient for cold starts\n- App crashed when opencode binary not installed\n- Server started unconditionally even for non-opencode users\n- Help text displayed on errors, confusing users\n\nChanges:\n- Add configu\n[…]\nry before starting (graceful skip)\n- Only auto-start server if default agent is opencode\n- Start server on-demand when opencode agent spawned\n- Add SilenceUsage to suppress help text on runtime errors",
          "is_bot": false,
          "headline": "fix(agent): improve opencode server startup (#94)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-13T08:47:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "980b4d0ea7f296d22cd905cef74701eccea32ee9",
          "body": "Previously, navigating the project list with j/k only moved the cursor\nbut didn't update the selected project until Enter was pressed. This\nwas confusing since there was no visual feedback on Enter. Now the\nhighlighted project is automatically selected during navigation.",
          "is_bot": false,
          "headline": "fix(ui): auto-select project on navigation (#93)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-13T08:32:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bdecb92e29e1b797b827739b6580f386618ba80b",
          "body": "HandleMouse was unconditionally forwarding all mouse events to the\nPTY as X10 escape sequences, even when the child process never\nrequested mouse tracking. This caused visible garbage text in apps\nthat don't enable mouse mode.\n\n- Add mouseEnabled field to track mouse tracking state\n- Scan terminal output for mouse mode escape sequences\n- Only forward mouse events when tracking is enabled\n- Add tests for escape sequence detection",
          "is_bot": false,
          "headline": "fix(terminal): prevent mouse events leaking to PTY (#92)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-13T08:06:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "483250b927047b30450029607fe11c9ed55b06da",
          "body": "The description textarea had a 500 character limit, truncating\nlong text when pasted. Setting CharLimit to 0 removes the limit.",
          "is_bot": false,
          "headline": "fix: remove character limit on ticket description (#91)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-13T08:05:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a27ff76230a1602085ecf53b01d4f239d23cd5c2",
          "body": "Blocker and project selectors had inconsistent indentation - their\nmulti-line content wasn't prefixed with the standard 2-space indent\nused by other form fields. Also, the project selector lacked visual\nprominence for the selected item compared to other selectors.\n\n- Add 2-space prefix to blocker/project lines in form render loop\n- Remove embedded indent from selector join (caller handles it now)\n- Add background highlight and padding to selected project rows",
          "is_bot": false,
          "headline": "fix(ui): improve ticket form field alignment (#90)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-13T07:45:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e479600cf1dbbfbe3f76ed36a548cb44651a1e5",
          "body": "--append-system-prompt only modifies Claude's instructions but\ndoesn't start the conversation. Passing the prompt as a positional\nargument makes it the first user message, prompting Claude to begin.",
          "is_bot": false,
          "headline": "fix(claude): inject prompt as initial user message (#89)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-13T07:42:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "09e61f0f257556ce1d0c02ec40b0c4b54b990456",
          "body": "- Add sessionName field to Pane struct with SetSessionName setter\n- Inject OPENKANBAN_SESSION env var when spawning agent terminals\n- Session name priority: AgentSessionID > BranchName > TicketID\n- Fix WriteStatusFile to create nested directories for slashed branch names\n- Add Claude Code Integration section to docs\n\nThis enables external tools (like oh-my-claude) to detect when running\nin an OpenKanban terminal and write status files that OpenKanban polls.",
          "is_bot": false,
          "headline": "feat: add OPENKANBAN_SESSION env var for external status integration",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2026-01-13T04:39:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ba73065df15f9dabce88b760de21da80b23c9118",
          "body": null,
          "is_bot": false,
          "headline": "docs: update demo gif with isolated environment and agent showcase (#88)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-06T18:53:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4d2aa4663410bec887a38b5cbdbb34471fe8c71d",
          "body": "* feat: add configurable color themes with 20 built-in options\n\n* feat: add semantic color system and theme dropdown UI\n\n- Refactor ThemeColors from hue-based (Blue/Green/Yellow) to semantic names\n  (Primary/Success/Warning/Error/Secondary/Info)\n- Add theme dropdown in settings with j/k navigation a\n[…]\n(backlog=primary,\n  in-progress=warning, done=success)\n- Update all 20 builtin themes with official palette colors\n- Update documentation with new color system\n\n* test: add unit tests for theme system",
          "is_bot": false,
          "headline": "feat: add configurable color themes with semantic color system (#87)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-05T07:45:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "035b19daed96f42a23720f72d22b9be0eb009763",
          "body": "* feat: add integration testing infrastructure with test isolation\n\nAdd OPENKANBAN_CONFIG_DIR env var support for test isolation, enabling\nintegration tests to run without affecting user data. Includes Makefile\nwith test targets and CI workflow updates.\n\n* fix: move runner.temp to step-level env in CI workflow",
          "is_bot": false,
          "headline": "feat: add integration testing infrastructure with test isolation (#86)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-05T07:40:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4f92902cb49a7f8d94271bb2b5751e7aaa954bb",
          "body": "- Add headerHeight() method with self-documenting constants\n- Add sidebarAllY(), sidebarProjectStartY(), sidebarAddProjectY() helpers\n- Fix header height calculation (was 5, now 4) for correct mouse click targets\n- Remove magic numbers from handleSidebarMouse() and renderSidebar()",
          "is_bot": false,
          "headline": "refactor: replace sidebar layout magic numbers with methods (#85)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-04T23:44:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "099834aae52038a68b36715c49f96358e22e581d",
          "body": "…#84)\n\n- Change sidebar project filter from single-select to multi-select with checkboxes\n- Add toggle all/toggle individual project selection (Space/Enter or click)\n- Add dedicated ModeCreateProject with standalone form for adding projects\n- Fix project persistence (was only in-memory, now saves to\n[…]\ngistry)\n- Add project delete from sidebar with 'd' key and ticket count in confirmation\n- Support ~ home directory expansion in project path input\n- Show inline error messages in project creation form",
          "is_bot": false,
          "headline": "feat: add multi-select project filtering and dedicated project form (…",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-04T23:16:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a4435949f626dab7b78defbabb007dadb92c7bde",
          "body": "Double-click ticket to spawn agent (if none running) or attach (if running).\nClick 'Ctrl+g Board' hint in agent view to return to board.",
          "is_bot": false,
          "headline": "feat: add mouse support for spawning and attaching agents (#83)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-04T21:50:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd7a6691b5a9985d5c661d8c9b4340a57a0bfb4f",
          "body": "Projects were saving the global default_agent at creation time, causing\nstale settings when the global default later changed. Now projects use\nempty default_agent and fall back to global config.\n\nAlso fixes settings agent cycling wrap-around and updates fallback list\nto include gemini and codex.",
          "is_bot": false,
          "headline": "fix: project default agent should fall back to global config (#82)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-04T21:22:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f20b0d0d95e29ab5b96d2bdf786d8e17bfbea4df",
          "body": "Update README, CONFIGURATION.md, AGENT_INTEGRATION.md, and AGENTS.md\nto include Gemini CLI and Codex CLI as supported agents.",
          "is_bot": false,
          "headline": "docs: add Gemini and Codex to supported agents documentation (#81)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-04T21:00:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38ae2174fbebb6bdd6144d7d2674466da4bdba06",
          "body": "Add support for Google Gemini CLI and OpenAI Codex CLI as first-class\nagents alongside OpenCode, Claude, and Aider.\n\n- Add default configs with --yolo (Gemini) and --full-auto (Codex) flags\n- Implement session resume via --resume and 'codex resume --last'\n- Add terminal content pattern matching for status detection\n- Filter GEMINI_* and CODEX_* environment variables in PTY\n- Update agent priority order: opencode > claude > gemini > codex > aider",
          "is_bot": false,
          "headline": "feat: add Gemini CLI and Codex CLI agent support (#80)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-04T20:50:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f882e63ec24e606a56dab69033e931d514cc5614",
          "body": "- Auto-scroll now shows entire field when tabbing (not just start line)\n- Track field end lines to calculate field heights\n- Account for scroll indicator space in viewport calculations\n- Remove ctrl+u/d keyboard scroll (Tab + mouse wheel is sufficient)\n- Fix scroll indicator count accuracy",
          "is_bot": false,
          "headline": "fix: improve form scroll behavior and show full fields on focus (#76)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-04T03:30:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b593622e10ddde1dcd2cbd7f3a552c173d5c695",
          "body": "* feat: add ticket dependency tracking\n\nTickets can now specify blockers (other tickets that block them).\nThis is informational only - no workflow enforcement.\n\n- Add BlockedBy field to Ticket struct\n- Show dependency badges on ticket cards (⛓N↑ blocked by, ⛓N↓ blocks)\n- Show related tickets in agen\n[…]\ncroll indicators when content is clipped\n- Support mouse wheel scrolling (3 lines per tick)\n- Support keyboard scrolling (Ctrl+U/D, PgUp/PgDown)\n- Form width now adapts to terminal width (40-60 chars)",
          "is_bot": false,
          "headline": "feat: make ticket form scrollable and responsive (#75)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-04T02:15:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a32d2a9244aaadef3599bb8f1fa0010c8c1a6825",
          "body": "* fix: improve agent status detection and session re-attachment\n\n- Return AgentNone instead of AgentIdle when status undetermined\n- Fix status detection cascade to try all methods sequentially\n- Add path normalization to FindOpencodeSession for symlink handling\n- Add --continue fallback for opencode\n[…]\nport-based API\n\nQuery OpenCode's /session/status API on the per-agent port to get\naccurate busy/idle status. Remove false 'working' assumption for\nunknown status - only show status when we're certain.",
          "is_bot": false,
          "headline": "fix: improve opencode agent status detection via port-based API (#74)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-04T00:40:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a28a7cdf4a988d69b09fe892e7cceee1ecbebbbd",
          "body": "Move agent documentation from .opencode/ to project root and add\ndedicated UI layer docs for the complex Bubbletea modal system.",
          "is_bot": false,
          "headline": "docs: reorganize AGENTS.md with hierarchical structure",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2026-01-03T22:30:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64181096326d1e8d1622c426f5b3d842542dff51",
          "body": "Allow users to choose which agent to use for each ticket in the\nticket form. The agent field is editable until an agent has been\nspawned, after which it locks (similar to branch name behavior).\n\nCloses #72",
          "is_bot": false,
          "headline": "feat: add per-ticket agent selection (#73)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-03T05:55:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ad9f7b2939370fc407a54bafd771400a1d8d41b",
          "body": "The -p shorthand was not recognized by opencode, causing immediate exit.\nAlso improved error reporting to show actual error instead of generic message.",
          "is_bot": false,
          "headline": "fix: use correct --prompt flag for opencode and surface spawn errors",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2026-01-03T05:15:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ee71971e74e98fe97b771b1fdd45c995572cd3c7",
          "body": "For new opencode sessions, don't pass --session flag even if\nFindOpencodeSession returns a stale ID from a previous run.\nOnly use session IDs when resuming existing sessions.",
          "is_bot": false,
          "headline": "fix: prevent stale session ID from failing first spawn (#70)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-03T04:45:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "41219fb5b49c32c33b337b94b9a36822064c7b7a",
          "body": "Go map iteration order is non-deterministic, causing project lists\nto reorder randomly on each render. Sort by name for stable ordering.",
          "is_bot": false,
          "headline": "fix: sort project lists to prevent UI flickering (#69)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2026-01-03T04:36:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cd594a50c60eb54a26c410bbd0a0ee4c4db2dfa",
          "body": null,
          "is_bot": false,
          "headline": "build: upgrade to Go 1.25",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-31T21:02:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "02d39887e42b08b5add6607417bbc54fb278f1a7",
          "body": null,
          "is_bot": false,
          "headline": "chore: run go mod tidy",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-31T20:14:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df72640ac22ec5d696cafc1dca4fc270f1c086dc",
          "body": null,
          "is_bot": false,
          "headline": "ci: remove golangci-lint job from CI workflow",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-31T20:04:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88dbb51d9e718c6073f7de74f20d95e6647f40af",
          "body": null,
          "is_bot": false,
          "headline": "fix: correct Go version in go.mod to 1.23",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-31T20:02:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "386b0dc18d31019a9170f36ee36763604b992422",
          "body": null,
          "is_bot": false,
          "headline": "ci: add golangci-lint, goreleaser check, fix Go version",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-31T19:37:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d978eadb9edfc7b67f6ebddd4dbd2f3ea3aaa49",
          "body": null,
          "is_bot": false,
          "headline": "docs: add workflows README explaining release flow",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-31T15:00:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2cb3dee2b7d5502fa84437de14af4941bb2a8fb0",
          "body": null,
          "is_bot": false,
          "headline": "ci: use path filters instead of in-workflow file checks",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-31T14:56:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9834d9b742f3a816820e18de673368369d18dc97",
          "body": null,
          "is_bot": false,
          "headline": "ci: restore separate workflows with actions:write permission",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-31T14:53:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "90649ef051bb182df7fdc515b325a9ea2b642588",
          "body": null,
          "is_bot": false,
          "headline": "ci: consolidate release workflows to fix permission error",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-31T14:48:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4418cc689b23cccfce562003070e6b9fdc581f60",
          "body": null,
          "is_bot": false,
          "headline": "feat: add auto-update notifications on startup (#66)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2025-12-31T14:30:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb36c47536a4d16c79c72891afa42e4daead86e7",
          "body": null,
          "is_bot": false,
          "headline": "ci: use openkanban[bot] identity for automated commits",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-30T07:34:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a940d48db4b5a94fae61a3c4314f41345017701",
          "body": "Tags pushed by GITHUB_TOKEN don't trigger other workflows.\nNow auto-release explicitly triggers release.yaml via workflow_dispatch.",
          "is_bot": false,
          "headline": "ci: fix auto-release to trigger release workflow",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-30T07:25:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f211357849462ad54220ffa1ecb64035c96686a1",
          "body": "Allow tickets to choose between worktree isolation or main repo mode.\nMain repo mode creates/checkouts the branch in place instead of a\nseparate worktree. Only one main-repo agent can run per project.",
          "is_bot": false,
          "headline": "feat: add per-ticket worktree toggle (#65)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2025-12-30T07:20:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f504b12f7f4015075ec918c23c199f27a2837c6f",
          "body": "Settings menu (O) now exposes 8 options:\n- Default agent, confirm quit, branch prefix\n- Cleanup toggles (worktree, branch, force)\n- Sidebar visibility, project filter\n\nTickets now support:\n- Labels: comma-separated tags displayed on cards\n- Priority: 1-5 scale with visual indicators for high priority",
          "is_bot": false,
          "headline": "feat: expand settings menu and add ticket labels/priority",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-30T06:07:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64a46518945306bca8179b77ad7025b8ca55012d",
          "body": null,
          "is_bot": false,
          "headline": "ci: add auto-release for app code changes and manual version dispatch",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-30T04:11:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bddf6e951b036b38dd1e654d8285bd4f5857527c",
          "body": null,
          "is_bot": false,
          "headline": "feat: auto-detect available agent CLI for default selection (#64)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2025-12-30T03:50:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ae2ac15d704b34eea7f5a3dbdc9a98c8dbf5ed98",
          "body": "- README: fix keybindings table (h/l navigates columns, space moves tickets)\n- ARCHITECTURE: add server.go, missing modes, opencode config section, fix AgentNone\n- DATA_MODEL: replace tmux with PTY architecture, update persistence model, fix structs\n- CONFIGURATION: add poll_interval, missing keybindings (g/G, /, tab, [, O)",
          "is_bot": false,
          "headline": "docs: update documentation to match current implementation (#63)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2025-12-29T20:08:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1ce6f9cf0123280aa2fab4f15d050800d7a656d",
          "body": null,
          "is_bot": false,
          "headline": "ci: remove VHS integration tests, keep smoke tests",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T21:11:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3896888278c5af29109d1dca3f70949789bb8c68",
          "body": null,
          "is_bot": false,
          "headline": "fix(ci): use single package for build output",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T21:10:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08bbe7653426ff8c8bc88e7117af75c19de85619",
          "body": null,
          "is_bot": false,
          "headline": "ci: add smoke tests and VHS integration testing",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T20:52:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fb06fb3ae53280f1e049b7107e6535b08fa8f8f7",
          "body": null,
          "is_bot": false,
          "headline": "build: migrate from brews to homebrew_casks for goreleaser v2",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T20:43:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd55178d0491d504c12de0476713523093244d4f",
          "body": "- Add 'Default Agent' to settings UI (cycles through configured agents)\n- Fix sidebar visibility not persisting to config file\n- Only warn about missing PATH for the default agent, not all agents",
          "is_bot": false,
          "headline": "feat: add default agent setting and fix config persistence",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T20:28:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cd86591163cec00f24f85365690a30bdd78f28cd",
          "body": null,
          "is_bot": false,
          "headline": "ci: remove lint job until golangci-lint supports Go 1.25",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T05:08:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac24233df6652bdf40b912403fa6387a79b56e56",
          "body": null,
          "is_bot": false,
          "headline": "ci: add test and lint workflow",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T05:01:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e544694d73af44648a9b86d17abf417eb4af32e1",
          "body": null,
          "is_bot": false,
          "headline": "docs: streamline AGENTS.md and update to Go 1.25",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T04:22:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b99e72de055ca2725e684375c8d54302d52ac8b9",
          "body": null,
          "is_bot": false,
          "headline": "build: improve release notes with grouped changelog and install header",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T03:57:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec3cb95cd4d5d3bcc23a970a19200ffb9f4f9613",
          "body": null,
          "is_bot": false,
          "headline": "docs: fix go install path case sensitivity",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T03:36:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "71ffb24f85a5ad7e6589d95217bc1c8c71356ec1",
          "body": null,
          "is_bot": false,
          "headline": "build: fix deprecated goreleaser archive format syntax",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T03:17:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "edf385e65de82dee305d5229bc6e358c9a31f3fe",
          "body": null,
          "is_bot": false,
          "headline": "build: add homebrew tap token for cross-repo release",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T02:46:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ec071ea2ce261b3af51708e2fb18bdafe611649e",
          "body": "- Add contextual status bar hints based on current mode\n- Add inline descriptions for ticket form fields\n- Enhance settings view with descriptions and sidebar toggle\n- Improve notification messages with actionable next steps\n- Polish project selector with better empty states\n- Add helpful empty column state messages\n\nCloses #40",
          "is_bot": false,
          "headline": "feat(ui): polish menu system with contextual hints and better messaging",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T01:54:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "af225bea4e95589bd103893112185f4d7e21f4c4",
          "body": "Instead of naming projects 'default' when no name is provided,\nuse the repository directory name for clearer identification.",
          "is_bot": false,
          "headline": "fix(cli): use directory name as default project name",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T01:40:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3935fd9d166ccd915d9f0547e2f99dcd993520c7",
          "body": "Pressing Esc when a filter is active now clears it, matching\nexpected UX behavior for search/filter interactions.",
          "is_bot": false,
          "headline": "feat(ui): clear filter with Esc in normal mode",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T01:30:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b11307d2630824cb98168ec28bbe166b5145b3d",
          "body": "- Adjust hitTest() to subtract sidebar width when visible\n- Switch from WithMouseCellMotion to WithMouseAllMotion for hover",
          "is_bot": false,
          "headline": "fix(ui): correct click detection with sidebar and enable hover effects",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T01:28:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "00bb3d078b9399dea65c25f9c0dde5f7958d1e83",
          "body": "Track hover state via MouseMotion events and apply subtle border\nhighlighting on hovered tickets and columns for better visual feedback.",
          "is_bot": false,
          "headline": "feat(ui): add mouse hover effects on tickets and columns (#61)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T01:06:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "24c045120d546284f25de460938a06eeb2e2afc0",
          "body": "- Add config validation for required fields, enums, and template syntax\n- Add 'config validate' command to check configuration\n- Add 'config generate' command to create default config\n- Add 'config path' command to show config location\n- Validate on app startup with clear error messages\n- Warn (not error) for missing PATH commands and placeholders\n\nCloses #54",
          "is_bot": false,
          "headline": "feat(config): add validation with helpful error messages (#59)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2025-12-28T00:41:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2f7b22c7e155665e61b6fad585804c6c1cd3c316",
          "body": null,
          "is_bot": false,
          "headline": "test: add unit tests for agent, git, and project packages",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-27T03:32:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e51c4ebb71c28035935c9906abbc3cd2399b9dd",
          "body": "- Each ticket gets a unique port (starting at 4097) passed via --port flag\n- Status detector queries the ticket-specific port instead of central server\n- Fixes status not updating for newly spawned agents\n- Also fixes worktree creation for stale directories and existing branches",
          "is_bot": false,
          "headline": "fix(agent): spawn opencode with per-ticket port for status polling",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-27T03:15:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c5ff224a4a84cde2ee36093b1c82465323e9c676",
          "body": "Move polling config from UI.RefreshInterval to Opencode.PollInterval\nfor agent-specific control. Default 1s for responsive status updates.\nAlso removes duplicate spinner from ticket header - status now shown\nonly in the bottom status line.",
          "is_bot": false,
          "headline": "feat(config): add configurable OpenCode polling interval",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-25T22:19:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2c441eb2a5a169173552aa10b47a66581712442",
          "body": "Worktree path wasn't being saved to tickets after spawn because\nspawnReadyMsg didn't include the worktree info. Status detection\nwas slow due to calling 'opencode session list' (2.5s) - now just\nqueries the API directly and checks if any session is busy.",
          "is_bot": false,
          "headline": "fix(agent): resolve OpenCode worktree and status detection issues",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-25T21:53:54Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f3dd1a71e39935d346515d3156abd38aefba8e2",
          "body": "- Fix pane not being deleted from map (was using empty key after clear)\n- Reset AgentSpawnedAt on spawn failure so retry is treated as new session\n- Extract resetSpawnState helper for cleaner spawn failure handling\n- Implement missing queryOpencodeStatusByDirectory method",
          "is_bot": false,
          "headline": "fix(ui): properly clean up state when agent spawn fails",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-25T21:24:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da9d64db5699ad90de6b64a1d8be8c7d8287ff54",
          "body": "- Start opencode server on app init (opencode serve --port 4096)\n- Ticket terminals use 'opencode attach --dir' to connect to server\n- Status API at /session/status now works for accurate status detection\n- Configurable via opencode.server_enabled and opencode.server_port\n- Falls back to standalone mode if server disabled\n\nFixes #58",
          "is_bot": false,
          "headline": "feat(agent): add OpenCode server integration for status detection",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-25T21:09:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c226786b4f38b6faf6a5dbeff461998835dc2503",
          "body": "- Collapsible sidebar showing all projects with ticket counts\n- Keyboard navigation: [ toggle, h/l focus, j/k navigate, enter select\n- Mouse support for sidebar items\n- Visual focus indicators (blue border when focused)\n- Configurable default visibility via ui.sidebar_visible config\n- Updated help screen and documentation",
          "is_bot": false,
          "headline": "feat(ui): add dashboard sidebar with project navigation",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-22T03:23:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c7e18d9e2e3b4ff1d42f256a98972533b8c9516",
          "body": "- Add / key for live search with @project syntax filtering\n- Rework project selector with list view, inline add, and delete\n- Add full mouse support across all modes\n- Add 'delete' CLI command for project removal\n- Default to global board view instead of auto-filtering to cwd\n- Remove unused cycle/filter functions",
          "is_bot": false,
          "headline": "feat(ui): add search/filter system and project management",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-22T02:30:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "51fc2f510b4596810de98c8e8cb40a12ba822855",
          "body": "- Help dialog: section icons, rounded border, better visual hierarchy\n- Ticket form: focus indicators, character count with color warnings\n- Agent view: breadcrumb navigation, session duration display\n- Scroll indicators: show count of hidden columns on each side",
          "is_bot": false,
          "headline": "ui: phase 3 polish - experience refinement",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-22T01:05:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "165b421b81d7cc974974d91296d89585505d6b11",
          "body": "- Ticket cards with left accent bar (color based on agent status)\n- Column icons (emoji) and WIP warning badges (red when at limit)\n- Mode-specific icons and colors in status bar\n- Enhanced drag-drop target feedback (double-line border)",
          "is_bot": false,
          "headline": "ui: phase 2 polish - core visual improvements",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-22T01:01:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5b40566ee2f898a38df1417293e71be51b8c4a1e",
          "body": "- Styled loading state with logo\n- Header with breathing room and separator line\n- Contextual empty column states (backlog: press n, done: completed here)\n- Error-aware notification toasts (red for failures)",
          "is_bot": false,
          "headline": "ui: phase 1 polish - quick wins",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-22T00:59:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "efd51a58d35bf889950408e5eda3270dcc54bc04",
          "body": null,
          "is_bot": false,
          "headline": "license: switch from MIT to AGPL-3.0",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-22T00:49:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b521ec51ad37f1e8c89aa26969056d32e03ec259",
          "body": null,
          "is_bot": false,
          "headline": "feat: add Homebrew tap support via goreleaser",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-21T21:24:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d16085cf843b64e015a87910a7bec3b635b733a6",
          "body": null,
          "is_bot": false,
          "headline": "docs: polish README with badges and professional layout",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-21T21:21:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f4758a47a2b93199a3f7d38af1eafa7cd23b8376",
          "body": "Add behavior.confirm_quit_with_agents setting (default: true).\nWhen false, agents close gracefully without prompting on quit.",
          "is_bot": false,
          "headline": "feat: add behavior settings for configurable quit confirmation",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-21T21:19:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8ef4209ff116421805b895726aeac39e5ccb758a",
          "body": null,
          "is_bot": false,
          "headline": "Adding image to readme",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2025-12-21T21:15:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7da592e01b49f6b6dca3405498ee3e33ddf0c56",
          "body": "- Add GitHub Actions release workflow (triggered on version tags)\n- Add goreleaser config for multi-platform builds\n- Add version command with build info injection\n- Add MIT LICENSE",
          "is_bot": false,
          "headline": "feat: add release automation with goreleaser",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-21T20:43:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c66b954a22af9705f1661ad2cec9a114d3431a14",
          "body": "- Add quit confirmation when agents are running\n- Graceful agent termination (SIGTERM → 3s timeout → SIGKILL)\n- Yellow spinner animation during shutdown\n- Green spinner animation during agent spawn (instant feedback)\n- Async worktree creation so spawn animation shows immediately\n- SIGTERM signal handling for external kill commands\n- Terminal content heuristics for agent status detection (WIP)\n\nCloses #57",
          "is_bot": false,
          "headline": "feat: graceful shutdown and spawn animations (#57)",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-21T20:42:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1619c4201ffb46581bdf7f8578415b31bdb22e90",
          "body": "- Add centered demo.gif to README with simplified content\n- Move detailed config docs to docs/CONFIGURATION.md\n- Add demo.tape for reproducible gif generation\n- Fix ticket selection persistence after create/move operations",
          "is_bot": false,
          "headline": "docs: add demo gif and configuration guide",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-21T05:07:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0e96e54d5e30c9f7d48c35cc8b565a7ea21c219",
          "body": "Add comprehensive tests for:\n- board: Slugify, NewTicketID, NewTicket, Touch, SetStatus, DefaultColumns, BoardError\n- config: DefaultConfig, Load/Save, ConfigDir/Path, GetEffectiveInitPrompt, mergeAgentDefaults\n\nCloses #38",
          "is_bot": false,
          "headline": "test: add unit tests for board and config packages",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-21T03:17:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dcd049d344c0d501dd5ecb53b059d695cdc9ee45",
          "body": "Update all documentation to reflect actual implementation:\n- Remove tmux references, document PTY-based terminals\n- Fix config format (YAML → JSON) and commands (init → new)\n- Document project registry and per-project ticket storage\n- Rewrite agent integration guide for embedded PTY approach\n\nCloses partial work on #38",
          "is_bot": false,
          "headline": "docs: sync documentation with post-MVP architecture",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-21T03:12:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3edda4286e453d702f31437b1fdccfcee260b9ae",
          "body": "- Replace board-per-directory model with project registry\n- Add GlobalTicketStore to aggregate tickets from all projects\n- Store tickets in each repo's .openkanban/tickets.json\n- Add 'p' key to cycle project filter in global view\n- Show project name on ticket cards when viewing all projects\n\nCloses #47",
          "is_bot": false,
          "headline": "refactor: project-centric architecture with global ticket view (#48)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2025-12-21T02:59:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17f6833c57b4215dd192281995ee3ef4dfaad894",
          "body": null,
          "is_bot": false,
          "headline": "docs: add AGENTS.md for AI coding agent guidance",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-20T21:05:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a19005a08c579f0e482cd003a781919f516b99bd",
          "body": "Status detection was blocking the UI every 5 seconds due to:\n- HTTP calls to opencode API (2s timeout)\n- External command execution (opencode session list)\n\nNow all blocking operations run in a background goroutine via\ntea.Cmd, with results delivered via agentStatusResultMsg.",
          "is_bot": false,
          "headline": "perf(ui): move agent status polling to background goroutine",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-20T20:54:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e3ed4d6d2559ee31591e2a823c1a74e5332f216",
          "body": "feat: worktrees share parent repo board",
          "is_bot": false,
          "headline": "Merge pull request #42 from TechDufus/feat/in-place-checkout",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2025-12-20T04:40:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b60ed920d9a6ea16064a0fc333a1ff3e6749de5b",
          "body": "Add ResolveMainRepo() that detects if a path is a git worktree and\nresolves it to the main repository path. This allows worktrees to\nshare the same board as their parent repo.\n\nWhen running openkanban from a worktree directory, it now finds and\nuses the board associated with the main repository instead of failing\nto find a board or creating a separate one.\n\nCloses #37",
          "is_bot": false,
          "headline": "feat(git): resolve worktrees to share parent repo board",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-20T04:29:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1aa71e86b725bebfe163a51aae624a900d049b2c",
          "body": "* fix: resolve MVP blocking issues #33 and #36\n\n- Fix agent status detection by using actual OpenCode session ID\n  instead of branch name when querying the status API (#33)\n- Fix '?' key triggering help overlay in form modes by restricting\n  help toggle to ModeNormal and ModeHelp only (#36)\n\n* feat(\n[…]\nFix renderWithOverlay() to center dialogs using lipgloss.Place()\n- Route help menu through overlay system for consistent centering\n- Update help text to document new keybinding\n\nCloses #34, closes #35",
          "is_bot": false,
          "headline": "fix: resolve MVP blocking issues #33 and #36 (#39)",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2025-12-20T02:54:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa67d31e889534084130841103897eab83c5a092",
          "body": "- Add HandleMouse to forward wheel/click events to PTY\n- Remove custom scrollback buffer (unused, agents handle their own scroll)\n- Remove keyboard scroll handlers (PgUp/PgDn now go to agent)\n- Simplify pane rendering to live screen only",
          "is_bot": false,
          "headline": "fix: forward mouse events to PTY for native agent scrolling",
          "author_name": "TechDufus",
          "author_login": "TechDufus",
          "committed_at": "2025-12-19T22:33:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d82fb4662f53673ee257f0d43f88e4c6ff6cd36b",
          "body": "…istory-of-agent\n\nfix: correct scrollback rendering math for mouse wheel scroll",
          "is_bot": false,
          "headline": "Merge pull request #32 from TechDufus/agent/bug-cannot-scroll-up-in-h…",
          "author_name": "Matthew DeGarmo",
          "author_login": "TechDufus",
          "committed_at": "2025-12-18T22:50:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 39,
      "commits_last_year": 118,
      "latest_release_at": "2026-06-12T16:51:24Z",
      "latest_release_tag": "v0.1.1",
      "releases_from_tags": false,
      "days_since_last_push": 40,
      "active_weeks_last_year": 7,
      "days_since_latest_release": 40,
      "mean_days_between_releases": 16.7
    },
    "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/techdufus/openkanban",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/techdufus/openkanban",
          "is_deprecated": false,
          "latest_version": "v0.1.1",
          "repository_url": "https://github.com/techdufus/openkanban",
          "versions_count": 42,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-06-12T16:46:34Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 40
        }
      ]
    },
    "popularity": {
      "forks": 15,
      "stars": 126,
      "watchers": 1,
      "fork_history": {
        "days": [
          {
            "date": "2026-01-07",
            "count": 1
          },
          {
            "date": "2026-01-13",
            "count": 1
          },
          {
            "date": "2026-02-09",
            "count": 1
          },
          {
            "date": "2026-02-11",
            "count": 1
          },
          {
            "date": "2026-02-20",
            "count": 1
          },
          {
            "date": "2026-03-02",
            "count": 1
          },
          {
            "date": "2026-03-06",
            "count": 1
          },
          {
            "date": "2026-04-04",
            "count": 1
          },
          {
            "date": "2026-04-17",
            "count": 1
          },
          {
            "date": "2026-04-21",
            "count": 1
          },
          {
            "date": "2026-05-01",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-06-12",
            "count": 2
          }
        ],
        "complete": true,
        "collected": 14,
        "total_forks": 15
      },
      "star_history": null,
      "open_issues_and_prs": 5
    },
    "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": 71366,
      "source_files_sampled": 38,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md",
        "internal/CLAUDE.md",
        "internal/agent/CLAUDE.md",
        "internal/terminal/CLAUDE.md",
        "internal/ui/AGENTS.md",
        "internal/ui/CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 6758
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.30.0",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5024"
            ],
            "fixed_version": "0.44.0",
            "advisory_count": 1,
            "oldest_advisory_days": 61
          },
          {
            "name": "golang.org/x/text",
            "direct": false,
            "version": "v0.3.8",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5970"
            ],
            "fixed_version": "0.39.0",
            "advisory_count": 1,
            "oldest_advisory_days": 8
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "unknown": 2
        },
        "advisory_count": 2,
        "affected_count": 2,
        "assessed_count": 28,
        "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.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.4"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/creack/pty",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.24"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "github.com/hinshun/vt10x",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20220301184237-5011da428d02"
        },
        {
          "name": "github.com/spf13/cobra",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.8.1"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "github.com/charmbracelet/bubbles",
            "direct": true,
            "version": "v0.21.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/bubbletea",
            "direct": true,
            "version": "v1.3.4",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/lipgloss",
            "direct": true,
            "version": "v1.1.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/creack/pty",
            "direct": true,
            "version": "v1.1.24",
            "ecosystem": "go"
          },
          {
            "name": "github.com/google/uuid",
            "direct": true,
            "version": "v1.6.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/hinshun/vt10x",
            "direct": true,
            "version": "v0.0.0-20220301184237-5011da428d02",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/cobra",
            "direct": true,
            "version": "v1.8.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/atotto/clipboard",
            "direct": false,
            "version": "v0.1.4",
            "ecosystem": "go"
          },
          {
            "name": "github.com/aymanbagabas/go-osc52/v2",
            "direct": false,
            "version": "v2.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/colorprofile",
            "direct": false,
            "version": "v0.2.3-0.20250311203215-f60798e515dc",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/ansi",
            "direct": false,
            "version": "v0.8.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/cellbuf",
            "direct": false,
            "version": "v0.0.13-0.20250311204145-2c3ea96c31dd",
            "ecosystem": "go"
          },
          {
            "name": "github.com/charmbracelet/x/term",
            "direct": false,
            "version": "v0.2.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/erikgeiser/coninput",
            "direct": false,
            "version": "v0.0.0-20211004153227-1c3628e74d0f",
            "ecosystem": "go"
          },
          {
            "name": "github.com/inconshreveable/mousetrap",
            "direct": false,
            "version": "v1.1.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/lucasb-eyer/go-colorful",
            "direct": false,
            "version": "v1.2.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-isatty",
            "direct": false,
            "version": "v0.0.20",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-localereader",
            "direct": false,
            "version": "v0.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-runewidth",
            "direct": false,
            "version": "v0.0.16",
            "ecosystem": "go"
          },
          {
            "name": "github.com/muesli/ansi",
            "direct": false,
            "version": "v0.0.0-20230316100256-276c6243b2f6",
            "ecosystem": "go"
          },
          {
            "name": "github.com/muesli/cancelreader",
            "direct": false,
            "version": "v0.2.2",
            "ecosystem": "go"
          },
          {
            "name": "github.com/muesli/termenv",
            "direct": false,
            "version": "v0.16.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/rivo/uniseg",
            "direct": false,
            "version": "v0.4.7",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/pflag",
            "direct": false,
            "version": "v1.0.5",
            "ecosystem": "go"
          },
          {
            "name": "github.com/xo/terminfo",
            "direct": false,
            "version": "v0.0.0-20220910002029-abceb7e1c41e",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sync",
            "direct": false,
            "version": "v0.11.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.30.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/text",
            "direct": false,
            "version": "v0.3.8",
            "ecosystem": "go"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 28,
        "direct_count": 7,
        "indirect_count": 21
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 1,
        "merged_prs": 46,
        "open_issues": 4,
        "closed_ratio": 0.923,
        "closed_issues": 48,
        "closed_unmerged_prs": 4
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "TechDufus",
          "commits": 118,
          "avatar_url": "https://avatars.githubusercontent.com/u/46715299?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "auto-release.yaml",
        "ci.yaml",
        "release.yaml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 3,
            "reason": "branch protection is not maximal on development and all release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 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": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
            "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": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 8,
            "reason": "2 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "02201ed231e37519541e9d92cd1e66316a7e97cb",
        "ran_at": "2026-07-23T02:19:03Z",
        "aggregate_score": 3.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-06-12T16:51:28Z",
      "oldest_open_prs": [
        {
          "number": 102,
          "created_at": "2026-01-23T02:55:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-01-23T02:21:35Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 77,
          "created_at": "2026-01-04T03:55:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 78,
          "created_at": "2026-01-04T03:55:16Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 79,
          "created_at": "2026-01-04T03:55:31Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 95,
          "created_at": "2026-01-13T08:48:30Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/TechDufus/openkanban",
    "host": "github.com",
    "name": "openkanban",
    "owner": "TechDufus"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 48,
        "vitality": 61,
        "community": 47,
        "governance": 60,
        "engineering": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 61,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "at_risk",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 41,
            "inputs": {
              "commits_last_year": 118,
              "human_commit_share": 1,
              "days_since_last_push": 40,
              "active_weeks_last_year": 7
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 40 days ago",
                "points": 18,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 40
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "7/52 weeks with commits",
                "points": 4.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "118 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 118
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 39,
              "latest_release_tag": "v0.1.1",
              "releases_from_tags": false,
              "days_since_latest_release": 40,
              "mean_days_between_releases": 16.7
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "39 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 39
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 40 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 40
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~16.7 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 16.7
                    }
                  }
                ],
                "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": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 40,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 40 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 40
                    }
                  }
                ],
                "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": 47,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 44,
            "inputs": {
              "forks": 15,
              "stars": 126,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "126 stars",
                "points": 34,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 126
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "15 forks",
                "points": 9.6,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 15
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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 (AGPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "AGPL-3.0"
                    }
                  }
                ],
                "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": 60,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "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 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 2 contributing companies or organizations -- score normalized to 6",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 78,
            "inputs": {
              "merged_prs": 46,
              "open_issues": 4,
              "closed_issues": 48,
              "issue_closed_ratio": 0.923,
              "closed_unmerged_prs": 4
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "92% of issues closed",
                "points": 43.2,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "46/50 decided PRs merged",
                "points": 35.2,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 46,
                      "decided": 50
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 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": 64,
            "inputs": {
              "followers": 180,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "TechDufus",
              "public_repos": 82,
              "account_age_days": 2745
            },
            "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": "180 followers of TechDufus",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 180,
                      "login": "TechDufus"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "82 public repos, account ~7 yr old",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 82
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 7
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/techdufus/openkanban"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 40
            },
            "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 40 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 40
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "42 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 42
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 67,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "3 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 48,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": null,
            "notes": [],
            "value": 35,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 18,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 0,
              "scorecard_aggregate": 3.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 is not maximal on development and all release branches",
                "points": 2.2,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 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 not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "2 existing vulnerabilities detected",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 28 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 28
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 2,
              "affected_packages": 2,
              "assessed_packages": 28,
              "unassessed_packages": 0,
              "affected_by_severity": "unknown 2",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 28,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "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": 2
            },
            "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": "good",
        "name": "AI Readiness",
        "value": 76,
        "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.99,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md",
                "internal/CLAUDE.md",
                "internal/agent/CLAUDE.md",
                "internal/terminal/CLAUDE.md",
                "internal/ui/AGENTS.md",
                "internal/ui/CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 6758
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md, internal/CLAUDE.md, internal/agent/CLAUDE.md, internal/terminal/CLAUDE.md, internal/ui/AGENTS.md, internal/ui/CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md, internal/CLAUDE.md, internal/agent/CLAUDE.md, internal/terminal/CLAUDE.md, internal/ui/AGENTS.md, internal/ui/CLAUDE.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": "99 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 99,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 61,
            "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": false,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "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": 71366,
              "source_files_sampled": 38,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/38 source files over 60KB",
                "points": 53.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 38,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T02:19:17.381175Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/t/TechDufus/openkanban.svg",
  "full_name": "TechDufus/openkanban",
  "license_state": "standard",
  "license_spdx": "AGPL-3.0"
}

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.27.0 — metodología completa · wiki de métricas.

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