Публічний реєстр
Звіт про здоров'я програмного забезпеченнясхема 0.27.0 · метрики 1.13.0 · 2026-07-23 02:19 UTC

TechDufus / openkanban

TUI kanban board for orchestrating AI coding agents

GoAGPL-3.0★ 126 зірок⑂ 15 форківз груд. 2025 р.Переглянути на GitHub ↗

TechDufus/openkanban має індекс здоров’я 57 зі 100, що відповідає смузі «Помірний». Найвищий показник — AI Readiness (76/100), найнижчий — Community & Adoption (47/100). Останнє оновлення було 40 днів тому. Більшість нещодавньої роботи виконує один учасник.

57
загалом / 100
Помірний

Індекс здоров'я програмного забезпечення

Метрики згруповано у зважені категорії на шкалі 1–100. Загальна оцінка починається як їхнє середнє; коли публічні дані активують Політику юрисдикцій високого ризику, рейтинг коригується й отримує верхню межу 49 («Під ризиком»). Готовність до ШІ не входить до індексу.

57
Відмінний85-100Зразковий; відповідає практично всім перевіреним критеріям
Добрий70-84Здоровий; незначні прогалини
Помірний50-69Прийнятний, але з помітними прогалинами; рекомендовано перевірку
У зоні ризику30-49Суттєві слабкі місця; впровадження потребує обережності
Критичний1-29Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

Профіль оцінок

Кожна вісь — окрема категорія. Форма важить більше, ніж середнє: здоровий об'єкт заповнює всю фігуру, тоді як профіль із піками та провалами означає, що сила в одному вимірі маскує ризик в іншому.

Власність

Matthew DeGarmoОсобистий обліковий запис
180 підписників82 публічні репозиторіїз січ. 2019 р.@Raft-Tech

Цей репозиторій належить особистому обліковому запису. Проєкт з єдиним власником несе більший ризик безперервності, ніж підтримуваний організацією.

Пакетні екосистеми

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Gogithub.com/techdufus/openkanbanv0.1.1-4240 днів тому

Метрики за категоріями

Життєздатність

Чи живий проєкт — чи пишеться код і чи виходять релізи?

61Помірний · 22% загального індексу

Активність розробки

41У зоні ризику
Як обчислюється оцінка
18/36Свіжість push — останній push 40 дн. тому
4.8/36Ритм комітів — 7/52 тижнів із комітами
18/18Обсяг комітів — 118 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — 1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Використані вхідні дані
commits_last_year118
human_commit_share1
days_since_last_push40
active_weeks_last_year7
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 39 релізів
36/36Свіжість релізів — останній реліз 40 дн. тому
27/27Ритм релізів — реліз кожні ~16,7 дн.
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Використані вхідні дані
releases_count39
latest_release_tagv0.1.1
releases_from_tagsні
days_since_latest_release40
mean_days_between_releases16,7

Спільнота та впровадження

Чи має проєкт користувачів, завантаження, увагу та влаштовані умови для контриб’юторів?

47У зоні ризику · 18% загального індексу
Як обчислюється оцінка
34/60Зірки — 126 зірок
9.6/25Форки — 15 форків
0/15Спостерігачі — 1 спостерігачів
Використані вхідні дані
forks15
stars126
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (AGPL-3.0)
0/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingні
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні

Сталість та врядування

Чи переживе проєкт своїх людей — бас-фактор, реактивність, хто за ним стоїть і як супроводжуються пакети?

60Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
6/10OpenSSF Scorecard: Contributors — project has 2 contributing companies or organizations -- score normalized to 6
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
43.2/46.8Вирішення issue — закрито 92% issue
35.2/38.3Прийняття PR — злито 46/50 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs46
open_issues4
closed_issues48
issue_closed_ratio0,923
closed_unmerged_prs4
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
16.2/25Охоплення власника — 180 підписників у TechDufus
25/25Послужний список — 82 публічних репозиторіїв, вік облікового запису ~7 р.
Використані вхідні дані
followers180
owner_typeUser
is_verified
owner_loginTechDufus
public_repos82
account_age_days2 745
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.

Супровід пакетів

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у go
35/35Свіжість публікацій — остання публікація 40 дн. тому
20/20Історія версій — 42 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgithub.com/techdufus/openkanban
ecosystemsgo
any_deprecatedні
min_days_since_publish40

Інженерна якість

Чи наявні базові інженерні практики та документація?

67Помірний · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 3 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-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
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

Документація

65Помірний
Як обчислюється оцінка
30/30README
25/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
0/10Теми
0/10Wiki
Використані вхідні дані
topics
has_wikiні
homepage
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

Чи міцні видимі практики безпеки й ланцюга постачання, без непослабленої пов’язаності з юрисдикціями високого ризику?

48У зоні ризику · 16% загального індексу

Стан безпеки

35У зоні ризику
Як обчислюється оцінка
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.5Ліцензія — 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
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated18
scorecard_versionv5.5.0
checks_inconclusive0
scorecard_aggregate3,5
Як обчислюється оцінка
35/35Прямі залежності без відомих сповіщень — жодна пряма залежність не має відомих сповіщень
0/25Непрямі залежності без відомих сповіщень — транзитивний набір не відокремлюється від залежностей розробки й тестування в цьому обсязі
0/40Немає задавнених сповіщень — жодне сповіщення не має дати публікації
Використані вхідні дані
sourceosv
advisories2
affected_packages2
assessed_packages28
unassessed_packages0
affected_by_severityunknown 2
direct_affected_packages0
Виключено з оцінювання (немає даних або не застосовно): Непрямі залежності без відомих сповіщень, Немає задавнених сповіщень. Залишкові ваги перенормовано. Звірено 28 резолвлених залежностей із OSV. Цей репозиторій не публікує пакета, який резолвить індекс, тож натомість оцінено граф залежностей репозиторію. Цей граф змішує закріплені версії для розробки й тестування зі справді постачаними залежностями, тож оцінюються лише задекларовані runtime-залежності; транзитивні знахідки подаються як контекст і в оцінку не входять. Досяжність не аналізується.

Готовність до ШІ

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Незалежний, експериментальний бейдж — вага 0.0, тож він подається окремо і не впливає на загальний індекс здоров'я.

76Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md, internal/CLAUDE.md, internal/agent/CLAUDE.md, internal/terminal/CLAUDE.md, internal/ui/AGENTS.md, internal/ui/CLAUDE.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 99 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
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_bytes6 758
Як обчислюється оцінка
18/18Розгортання однією командою — Makefile
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 100 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum
has_dockerfileні
typed_languageтак
bootstrap_filesMakefile
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
53.6/55Керовані розміри файлів — 1/38 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes71 366
source_files_sampled38
oversized_source_files1

Ключові факти

126зірок GitHub
1контриб'юторів
118комітів за останні 12 місяців
40днів від останнього пушу
39релізів
1бас-фактор
4відкритих issue
Goпакетних екосистем

Попередження щодо збору даних

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

Докладніше

Історія зірок і форків 0 ★ / 15 ⇿
0Зірки
15Форки
16Релізи

Коли додано кожну зірку й форк — зібрано з GitHub і згруповано за днями. Кумулятивне зростання розміщено просто над денними додаваннями, з яких воно складається, тож їх видно одне проти одного: рівномірне органічне накопичення виглядає зовсім інакше, ніж різкий короткочасний сплеск. Там, де цю різницю можна виміряти, її подано як автентичність росту.

03581013151422026-012026-032026-06
Мажорні 0Мінорні 1Патчі 15
OpenSSF Scorecard 3.5 / 10
3.5сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).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
Прямі залежності 7
РеєстрПакетОбмеження версіїМаніфест
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
Усі залежності 28

Повний розв'язаний набір залежностей із графа залежностей GitHub: 7 прямих і 21 непрямих (транзитивних) пакетів. Транзитивне замикання є повним, коли в репозиторії закомічено lockfile.

РеєстрПакетВерсіяЗв'язок
Gogithub.com/charmbracelet/bubblesv0.21.0пряма
Gogithub.com/charmbracelet/bubbleteav1.3.4пряма
Gogithub.com/charmbracelet/lipglossv1.1.0пряма
Gogithub.com/creack/ptyv1.1.24пряма
Gogithub.com/google/uuidv1.6.0пряма
Gogithub.com/hinshun/vt10xv0.0.0-20220301184237-5011da428d02пряма
Gogithub.com/spf13/cobrav1.8.1пряма
Gogithub.com/atotto/clipboardv0.1.4непряма
Gogithub.com/aymanbagabas/go-osc52/v2v2.0.1непряма
Gogithub.com/charmbracelet/colorprofilev0.2.3-0.20250311203215-f60798e515dcнепряма
Gogithub.com/charmbracelet/x/ansiv0.8.0непряма
Gogithub.com/charmbracelet/x/cellbufv0.0.13-0.20250311204145-2c3ea96c31ddнепряма
Gogithub.com/charmbracelet/x/termv0.2.1непряма
Gogithub.com/erikgeiser/coninputv0.0.0-20211004153227-1c3628e74d0fнепряма
Gogithub.com/inconshreveable/mousetrapv1.1.0непряма
Gogithub.com/lucasb-eyer/go-colorfulv1.2.0непряма
Gogithub.com/mattn/go-isattyv0.0.20непряма
Gogithub.com/mattn/go-localereaderv0.0.1непряма
Gogithub.com/mattn/go-runewidthv0.0.16непряма
Gogithub.com/muesli/ansiv0.0.0-20230316100256-276c6243b2f6непряма
Gogithub.com/muesli/cancelreaderv0.2.2непряма
Gogithub.com/muesli/termenvv0.16.0непряма
Gogithub.com/rivo/unisegv0.4.7непряма
Gogithub.com/spf13/pflagv1.0.5непряма
Gogithub.com/xo/terminfov0.0.0-20220910002029-abceb7e1c41eнепряма
Gogolang.org/x/syncv0.11.0непряма
Gogolang.org/x/sysv0.30.0непряма
Gogolang.org/x/textv0.3.8непряма
Сповіщення про залежності 2

Цей репозиторій не публікує пакета, який розпізнає індекс, тож оцінено його власний граф залежностей — 28 пакетів, серед яких є й піниї розробки та тестування, що ніколи не постачаються: 2 мають відомі сповіщення, з них 0 прямі.

ПакетВерсіяЗв'язокКритичністьСповіщеньВиправлено в
golang.org/x/sysv0.30.0непряманевідома10.44.0
golang.org/x/textv0.3.8непряманевідома10.39.0

Сповіщення означає, що версія, записана в графі залежностей, потрапляє в уражений діапазон. Досяжність не аналізується, а граф містить піниї розробки й тестування — знахідка може стосуватися інструментів, а не поставленого коду.

Звіт у форматі JSON машиночитний
{
  "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"
}

Оцінки — це сигнали, а не гарантії. Вони відображають публічно видимі практики на GitHub — це не аудит коду й не гарантія безпеки.

Відсутні дані виключаються, а ваги перенормовуються — нуль за відсутність ніколи не ставиться. Методологія версіонована й відкрита: метрики v1.13.0, схема v0.27.0 — повна методологія · вікі метрик.

Як окремий результат виглядає на тлі всього реєстру: сукупна статистикаGo.