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

mustachius / taskframe

GoMIT★ 4 зірки⑂ 0 форківз лип. 2026 р.Переглянути на GitHub ↗

mustachius/taskframe має індекс здоров’я 43 зі 100, що відповідає смузі «У зоні ризику». Найвищий показник — Vitality (68/100), найнижчий — Community & Adoption (28/100). Останнє оновлення було 4 дні тому. Більшість нещодавньої роботи виконує один учасник.

43
загалом / 100
У зоні ризику

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

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

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

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

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

Власність

mustachiusОсобистий обліковий запис
8 підписників14 публічних репозиторіївз груд. 2014 р.

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

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

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

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

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

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

68Помірний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 4 дн. тому
1.4/36Ритм комітів — 2/52 тижнів із комітами
16.8/18Обсяг комітів — 73 комітів за останній рік
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Використані вхідні дані
commits_last_year73
human_commit_share1
days_since_last_push4
active_weeks_last_year2
Як обчислюється оцінка
16.2/27Випускає релізи — 3 тегів версій (без релізів GitHub)
36/36Свіжість релізів — останній реліз 4 дн. тому
27/27Ритм релізів — реліз кожні ~1,4 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count3
latest_release_tagv0.2.1
releases_from_tagsтак
days_since_latest_release4
mean_days_between_releases1,4
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

28Критичний · 18% загального індексу
Як обчислюється оцінка
7.7/60Зірки — 4 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars4
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
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ні

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

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

33У зоні ризику · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
0/46.8Вирішення issue — немає issue або даних
0/38.3Прийняття PR — немає вирішених pull request-ів або даних
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Виключено з оцінювання (немає даних або не застосовно): Вирішення issue, Прийняття PR. Залишкові ваги перенормовано.

Власність та опіка

47У зоні ризику
Як обчислюється оцінка
10/30Підтримка власника — особистий (користувацький) обліковий запис
0/20Верифікований домен — не застосовно до користувацьких облікових записів
6.9/25Охоплення власника — 8 підписників у mustachius
20.6/25Послужний список — 14 публічних репозиторіїв, вік облікового запису ~11 р.
Використані вхідні дані
followers8
owner_typeUser
is_verified
owner_loginmustachius
public_repos14
account_age_days4 235
Виключено з оцінювання (немає даних або не застосовно): Верифікований домен. Залишкові ваги перенормовано.
Як обчислюється оцінка
25/25Опубліковано й доступно — 1 пакет(ів) у go
35/35Свіжість публікацій — остання публікація 4 дн. тому
12/20Історія версій — 3 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgithub.com/mustachius/taskframe
ecosystemsgo
any_deprecatedні
min_days_since_publish4

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

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

48У зоні ризику · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 2 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — немає даних
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: CI-Tests. Залишкові ваги перенормовано.

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

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

Безпека

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

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

Стан безпеки

34У зоні ризику
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — немає даних
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
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
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 — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — немає даних
5/5Pinned-Dependencies — all dependencies are pinned
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6/7.5Vulnerabilities — 2 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3,4
Виключено з оцінювання (немає даних або не застосовно): ci_tests, packaging, signed_releases. Залишкові ваги перенормовано.

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

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

63Помірний · 0% загального індексу
Як обчислюється оцінка
0/45Інструкції для агентів — немає CLAUDE.md / AGENTS.md / правил редактора
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 73 з 73 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
Як обчислюється оцінка
12.6/18Розгортання однією командою — go.mod (домовленість інструментарію, без раннера задач)
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — lockfile
0/10Підтверджена практика роботи з агентами — серед останніх 73 комітів немає створених агентом
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
10/10OpenSSF Scorecard: Pinned-Dependencies — all dependencies are pinned
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum
has_dockerfileні
typed_languageтак
bootstrap_files
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
55/55Керовані розміри файлів — 0/73 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes32 071
source_files_sampled73
oversized_source_files0

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

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

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

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

Докладніше

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

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

223344422026-072026-072026-07
Мажорні 0Мінорні 1Патчі 1
OpenSSF Scorecard 3.4 / 10
3.4сукупно

Незалежна, не прив'язана до інструментів оцінка безпеки від відкритого проєкту OpenSSF Scorecard. Кожна перевірка винагороджує практику безпеки, а не інструмент конкретного постачальника. Перевірки, які Scorecard не зміг визначити, позначено н/д і виключено з оцінки безпеки (вони ніколи не зараховуються як нуль).Scorecard v5.5.0 · 2026-07-21 21:17 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
н/дCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
н/дPackagingpackaging workflow not detected
10Pinned-Dependenciesall dependencies are pinned
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
8Vulnerabilities2 existing vulnerabilities detected
Прямі залежності 8
РеєстрПакетОбмеження версіїМаніфест
Gogithub.com/charmbracelet/bubblesv1.0.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/glamourv1.0.0go.mod
Gogithub.com/charmbracelet/harmonicav0.2.0go.mod
Gogithub.com/charmbracelet/lipglossv1.1.1-0.20250404203927-76690c660834go.mod
Gogithub.com/charmbracelet/x/ansiv0.11.6go.mod
Gogithub.com/muesli/termenvv0.16.0go.mod
Gomodernc.org/sqlitev1.53.0go.mod
Усі залежності не зібрано

Не вдалося зібрати розв'язаний набір залежностей для цього звіту: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 1855,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Go": 385185,
        "PowerShell": 2554
      },
      "pushed_at": "2026-07-17T12:48:29Z",
      "created_at": "2026-07-13T17:03:24Z",
      "owner_type": "User",
      "updated_at": "2026-07-20T18:45:18Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "mustachius",
      "company": null,
      "location": null,
      "followers": 8,
      "avatar_url": "https://avatars.githubusercontent.com/u/10211078?v=4",
      "created_at": "2014-12-16T17:04:07Z",
      "is_verified": null,
      "public_repos": 14,
      "account_age_days": 4235
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-07-17T12:40:35Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-17T12:36:16Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-07-14T15:32:19Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "ccda7206b0f1b7be5bd314a6741505d75b7ad181",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo gifs [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:48:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5a1f935a64e6dd0bab418d27fb4fdd867d13c602",
          "body": "Pushing v0.2.1 fired both workflows: path filters do not apply to tag\nevents, so vhs ran on a detached HEAD and its auto-commit step died\nwith exit 128, and CI re-ran a suite that had already passed for the\nsame commit. Both triggers are now scoped to branches.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "ci: do not trigger workflows on tag pushes",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:45:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c3ac7b3c8f5701c150ed326642706acc5c5bb751",
          "body": "Stale since the REPL became the default interface: both language\nblocks now say the REPL and list `taskframe classic` for the\nfull-screen TUI, which the usage never mentioned.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "fix(cli): help usage said the bare command opens the TUI",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:40:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dd8f34cb347f9b2f3ecbf175a788b4024d89e830",
          "body": "The install section now states the Go requirement up front, gains the\ngo install one-liner and an explicit \"nothing Windows-only\" note (CI\nalready tests on Linux), and the from-source example stops writing a\n.exe in a sh block. A short contributing section sets expectations\nbefore the project gets shared around.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "docs: install paths for Linux/macOS, Go requirement, contributing note",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:36:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d815ffa187464a9369ca40f25646cd1a650d3ee1",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo gifs [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:27:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "042091c6a66de506d9f0492c161f5768b0ec4234",
          "body": "New demo-classic.tape shows the redesigned classic interface in the\ncharm theme (tab jumps, the lit Overdue tab, an active task with\nelapsed time, and the detail dialog over the dimmed view); the vhs\nworkflow now renders both tapes and commits demo*.gif, and the README\nembeds the new gif in the classic section. The lip gloss credit slims\ndown to the charm theme bullet - the interface now speaks for itself.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "docs: classic TUI demo tape + slimmer Charm mentions",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T12:07:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f5420dbfbb9f96aaf6a15eb7a3464f413e6b66d8",
          "body": "The help modal gains the tab-band row and leads every combo with its\nletter (F-keys still bound, just secondary); dead fkey-era catalog keys\ndrop and the search info stops citing F7. README rewrites the classic\nTUI section around tabs, checklist marks, chips and dimmed dialogs, and\nthe theme list grows to eleven with charm.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "docs(tui): help, catalog and README catch up with the redesign",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T00:07:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1eaa783f4c380ec630e516c9f5b8380903134159",
          "body": "lipglossPlace blanked everything behind a modal; overlayModal now takes\nthe real midsection (renderMain, shared by both View paths), strips\neach line to plain text via the new ui.StripANSI (charmbracelet/x/ansi,\nalready in the module graph, promoted to a direct require) and re-renders\nit dim, splici\n[…]\ndescriptions even when the box was clamped below 94 cells (any 80-97\ncol terminal), which the new modal-open width test caught.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(tui): modals float over the dimmed live view",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T00:04:04Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b0afcb6974d710ad36c07697ca958414e2209be0",
          "body": "The status row becomes chips (count in the primary chip; @context,\nlanguage and sort in secondary ones, message in between), and the\nNorton F-key bar gives way to a dim one-line key legend that follows\nthe input focus (list / sidebar / search / modal). All F-keys stay\nbound — they only leave the visual. ASCII mode sanitizes the legend\nglyphs.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(tui): chip status bar and a dim hint line replace the F-key bar",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-17T00:00:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8a9c93b4e9aa7a9bc74efe10a3b0094091ccd16",
          "body": "The DOS-style [ ]/[x]/[-]/[>] cells become 1-cell checklist glyphs:\no pending, check done (strikethrough body unchanged), multiplication-x\ndeleted, filled-dot active with the elapsed suffix. --ascii degrades to\no/x/-/* and the fold arrows finally get ASCII fallbacks (v and >),\nwhich they never had.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(tui): checklist marks in the list and detail",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T23:58:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a367524324b80c6a158218d63f294e5c2bb579a3",
          "body": "The two double-border panels give way to open columns split by a thin\nborder-colored rule, Charm style: a title row above them carries the\nonly focus indicator (bold TitleFocus on the focused side). The list\ngains a column of width and the frame keeps its exact-height/width\ninvariants; mouse geometry now flows through contentTop/contentHeight\ninstead of literals.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(tui): boxless sidebar and list columns",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T23:56:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e0c64a2691bdaf81da19fd1c91a0e5c199a397b",
          "body": "A 3-line rounded tab band (All/Today/Overdue/Week/Active/Next/Waiting,\ndriven by the report registry) sits under the header; [/] cycle, 1-7\njump, mouse clicks hit-test through the same tabLayout spans the\nrenderer uses. Tab report ⊕ sidebar selection compose via Filter.Merge\n(context < tab < sidebar\n[…]\nband windows\naround the active tab with ‹ › markers. Dropping the per-filter counts\nalso cuts five store.List calls per reload.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(tui): report tabs replace the sidebar virtual filters",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T23:54:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a529c733278bab58ffdddba685d9ce90f88e170d",
          "body": "Rounded borders become the default box set (borland alone keeps its\ndouble-border Turbo Vision identity via the new per-palette box field).\nThe f-key styles are renamed to Chip/ChipAlt ahead of the status-chip\nbar, with per-theme secondary surfaces. New 11th theme `charm` mirrors\nthe lipgloss-README pink/purple look, wordmark gradient included.\n\nClaude-Session: https://claude.ai/code/session_012a7CpnKjjUho7Bohj6vdti",
          "is_bot": false,
          "headline": "feat(ui): per-theme box chars, chip styles, and the charm theme",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T23:46:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69611de19d06ebf56252a12d33778e902f586c24",
          "body": null,
          "is_bot": false,
          "headline": "docs: multi-line notes, REPL /sync, mouse and elapsed time in the README",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:56:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf270444cd7a25117c8f0200aeda8aa49fc2a7ec",
          "body": "Both panel boxes span exactly panelH rows with width-padded lines, so\nthe native join is output-identical to the hand-rolled loop. The modal\nplacer stays hand-rolled on purpose: lipgloss.Place returns oversized\ncontent unchanged, and tall modals rely on being clipped to panelH —\ndocumented on the function.",
          "is_bot": false,
          "headline": "refactor(tui): use lipgloss.JoinHorizontal for the panel join",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:54:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eee1e58d339b560afb3235ee193d842614047f33",
          "body": "WithMouseCellMotion: the wheel scrolls the task list, the sidebar and\nthe detail/read modals (through the same harmonica spring as the keys,\nvia a new scroller.scrollBy); a left click selects the row or sidebar\nitem under the pointer, and clicking the already-selected task opens\nits detail. Clicks o\n[…]\ne are no-ops,\nand context rows only select — Enter remains the activation toggle.\nTrade-off: native terminal text selection is disabled while the TUI\nruns (Shift+drag still works in Windows Terminal).",
          "is_bot": false,
          "headline": "feat(tui): mouse support in the classic interface",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:53:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2dc08ab12b9b53259c5cc89900545c87b4a71298",
          "body": "cli.RunSync is now exported and the REPL wraps it in a tea.Cmd: /sync\n[init <url>|status|pull|push] runs git off the UI thread with a\nbubbles/spinner line under the prompt. One run at a time; a fresh\nspinner per run keeps stale ticks inert, and completion caches refresh\nafter a pull replaces the database. Tab-completion and /help updated\n(/lang added to the completion list too).",
          "is_bot": false,
          "headline": "feat(repl): /sync command with a spinner (closes the sync phase 2)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:51:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c6f5e7469d85553b3e7273f0811b78222a787699",
          "body": "Notes render as markdown, so the capture box is now a real textarea:\nenter breaks the line and ctrl+d saves (esc still cancels; ctrl+d is\nintercepted before the textarea sees it — its default keymap binds it\nto delete-forward). Hints updated in both languages. Edit/child/prompt\ninputs stay single-line.",
          "is_bot": false,
          "headline": "feat: multi-line notes via bubbles/textarea (REPL and classic TUI)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:48:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95b5039c92f014947ab46c5d924784455832252b",
          "body": "New ui.FormatElapsed helper (<1m / 37m / 1h25m / 2d3h) rendered on\nstarted tasks in the TUI list and detail and in the REPL overlay and\ndetail. No live ticking — values refresh whenever the UI re-renders.",
          "is_bot": false,
          "headline": "feat: show elapsed time on active tasks (list, overlay, detail)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T21:45:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54568f1738fabec832352a878eddb7353d4539a5",
          "body": null,
          "is_bot": false,
          "headline": "docs: update the classic TUI section (logo header, new keys, sidebar)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:32:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "20ca97f76e12c4542d471bdf1ba8b18790d37f6a",
          "body": "Pending list rows now color each segment on its own: dim ids, accent\n[>] marker and tags, priority H/M highlighted, due dates red when\noverdue and orange (new warn color) when due today. Sidebar separators\nbecome labeled section headers, tag/context rows use the accent, counts\ndim. Detail view accen\n[…]\nindicators next to the\nsort mode. The help modal lists the new keys (S, U, L, Enter on @ctx)\nin two columns so it fits the header-shrunk canvas. Cursor rows stay\nsingle-style plain strings throughout.",
          "is_bot": false,
          "headline": "feat(tui): segment-level color pass, richer status bar, two-column help",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:32:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6db43a07e5c88fe30f0879d2a1b77453109774c6",
          "body": "New store.ProjectStatusCounts (GROUP BY project, status; deleted rows\nexcluded) feeds a 6-cell bar on sidebar project rows, aggregated up the\ndotted hierarchy like the pending counts. The bar renders styled on\nnormal rows and as plain glyphs inside the cursor highlight, and is\nomitted when the sidebar is too narrow. Closes the last pending item\nfrom the visual phase 1.",
          "is_bot": false,
          "headline": "feat(tui): per-project done/total progress bar in the sidebar",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:27:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b8f38af3db0b2375eec04044525c78845ca7c784",
          "body": "The classic TUI finally honors contexts like the REPL and CLI: the\nactive context folds into every list query (sidebar scalars win, tags\nunion — same Merge semantics as the REPL), defined contexts get their\nown sidebar section (@name rows, Enter toggles activation, ● marks the\nactive one), and virtual-filter counts fold the context in so numbers\nmatch what selecting them shows. Project and tag counts stay global.",
          "is_bot": false,
          "headline": "feat(tui): contexts in the sidebar, applied to the task list",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:24:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e966f7cb2b9ac5d30afa09466609d11ae50342f",
          "body": "Mirrors undo: U reapplies the most recently undone operation through\nstore.Redo; 'nothing to redo' surfaces on the red status line exactly\nlike undo's empty case.",
          "is_bot": false,
          "headline": "feat(tui): redo on key U",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:21:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8b2ea7412bd4e4ab34977cee78cbf72789c175c",
          "body": "S toggles the started state of the task under the cursor (the [>]\nmarker already rendered; only the toggle was missing). The sidebar's\nvirtual filters gain Active and Next rows from the shared report\nregistry, and the list panel now honors a report's display limit\n(next = 15) via Sidebar.Limit + TaskList.SetLimit.",
          "is_bot": false,
          "headline": "feat(tui): start/stop on key S; Active and Next views in the sidebar",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:20:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ef1939fd6022a73c3dcc3e2a74960672d405035a",
          "body": "Mirrors the REPL's /lang: L flips en<->pt-br in place, re-localizes the\ncached search prompt, persists through store.SetLanguage, and the\nstatus reload rebuilds the cached sidebar labels. Options.Lang is\nnormalized once in newApp so a zero value behaves as English.",
          "is_bot": false,
          "headline": "feat(tui): live language toggle on key L",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:17:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "50706a32fe20745ef7992158839623e2393e54ba",
          "body": "The classic TUI now keeps the TaskFrame logo at the top: the full\n6-line gradient wordmark when the terminal is at least 78x28, and a\ncompact one-line brand (with a language tag on the right) otherwise.\nThe header shrinks the panel area instead of adding rows, so the frame\nstill spans exactly the terminal height.",
          "is_bot": false,
          "headline": "feat(tui): always-visible adaptive logo header",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:17:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d6bb24bde700df71bba707451bae28a8baeb8699",
          "body": "… color\n\nMove the TASKFRAME wordmark art out of the REPL banner into internal/ui\n(exported, gradient-aware Wordmark helper) so the classic TUI can render\nit too. Add GradientLine (per-rune horizontal gradient) for one-line\nbrands, ProgressGlyphs (unstyled bar runes for single-style rows), a\nwarn due-soon color in all ten palettes, and StatusAccent (accent over\nthe status-bar background).",
          "is_bot": false,
          "headline": "feat(ui): shared wordmark, horizontal gradient, progress glyphs, warn…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T16:17:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc14d144489db838c82701c258b0dabce63126f6",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo.gif [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T12:06:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78a29ff194b06e163d5e164099ba7fbf7c32a8fc",
          "body": "Vary the feature bullets instead of one uniform bold-dash pattern, trim\nem dashes, and rewrite the sync paragraph; also note the five kept\nbackups and warn against embedding a token in the sync URL.",
          "is_bot": false,
          "headline": "docs: rework the README feature list and sync section",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T12:03:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "38ce8cb28aa22293f23b5fb0afc02af84f855fc5",
          "body": "The DB directory, sync backups and clone parent are now 0o700 and the\nfiles written by sync 0o600 (no-op on Windows, keeps other local users\nout on Unix). CI declares contents:read explicitly, every action is\npinned to a commit SHA, and the vhs job pins vhs v0.11.0 / ttyd 1.7.7\ninstead of latest.",
          "is_bot": false,
          "headline": "chore(security): tighten data-file permissions and harden CI workflows",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T12:02:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d53007336ab34138f16b396aa54cb5be51d60d29",
          "body": "govulncheck flagged GO-2026-5320 (XSS in goldmark, reachable through\nui.RenderMarkdown -> glamour) plus nine x/net advisories in code we do\nnot call. Both modules move to their fixed versions; the scan is clean.",
          "is_bot": false,
          "headline": "chore(deps): bump goldmark to 1.7.17 and x/net to 0.55.0",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T12:02:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8303a2c48eaec4bfad7c50235c3b156189b42200",
          "body": null,
          "is_bot": false,
          "headline": "docs: document sync and note/edit from the list overlay in the README",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-16T11:27:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b7bdaa1791da11a6b91e943fd289ff96a6e4fef8",
          "body": "…ck; delete refresh\n\nRound out the REPL list/detail overlays so tasks can be managed without\njuggling ids, and so every action gives visible confirmation.\n\n- Edit under the cursor (key `e`): opens an inline token editor over the\n  highlighted task (list) or the task being viewed (detail) — type the \n[…]\nl (retitle + reload), delete removes the row, plus a\nfile-backed note test proving notes always persisted (the earlier \"not saved\"\nreport was a feedback gap, not a save failure). gofmt/vet/test green.",
          "is_bot": false,
          "headline": "feat(repl): edit from the list/detail (key e); visible overlay feedba…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-15T22:22:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6ffbdf90f917a59a24f2b98c4222366ec1ab0664",
          "body": "Press `n` in the REPL `list` overlay to add a note to the task or subtask\nunder the cursor, and in the task detail view to note the task you're\nlooking at. Reaches parity with the classic TUI, which already had F5/`n`.\n\n- model.go: a `noteReturn` field records where the note box should return\n  to; \n[…]\ne row's task, parent or child). The `note <id>` command is\nunchanged. Tests: TestNoteFromList (task + subtask), TestNoteFromDetail\n(saves and reloads showing the note), TestNoteCancelFromListIsSilent.",
          "is_bot": false,
          "headline": "feat(repl): add a note from the list overlay and the detail view (key n)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-15T12:10:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "633dd9c25a7e42238d5ee73bd4ecb5944e50eb39",
          "body": "Add `taskframe sync` so tasks/notes/history can move between machines\n(home/work) through a private git repo holding a JSON export — no manual\nDB copying. Sequential, single-user; last-writer-wins with safety rails.\n\nA true merge is infeasible (task ids are local autoincrement rowids that\ncollide ac\n[…]\never\n--force. Auth is delegated to the user's git (GCM/SSH).\n\nTests: gitsync_test.go (bare repo) + cli/sync_test.go (two-machine LWW:\nadopt/push/pull/divergence/backup). Verified with the real binary.",
          "is_bot": false,
          "headline": "feat(sync): sync the database across machines via git (taskframe sync)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-15T10:58:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b021be73b9e48180a652d79c6348cf1a8d50b16d",
          "body": "…if shows it)",
          "is_bot": false,
          "headline": "docs: drop the static REPL screen replica from the README (the demo.g…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:46:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "707adea2be77228e5f20b039c29f1542dcd504bf",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo.gif [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:41:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3617758da125b50ddcd00085af753d0c98022d8",
          "body": "…rs in color\n\nGitHub sets CI=true, which makes lipgloss/termenv ignore ANSI and degrade the gradient banner to grayscale in the gif (only the markdown path force-overrode the profile). Replicate what charmbracelet/vhs-action did: empty CI + COLORTERM=truecolor.",
          "is_bot": false,
          "headline": "ci(vhs): set CI='' and COLORTERM=truecolor so the gradient logo rende…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:39:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33933e5ecf710e2500d3f7e83ac74a8a25176649",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo.gif [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:37:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e6167782490fb7e76dc8f5a77871df87951f02df",
          "body": "The REPL scrollback is immutable, so the mid-demo '/theme dracula' switch never recolored the banner/output in the gif. Launch already in dracula (TASKFRAME_THEME) so the gradient logo and note render in color from the start; drop the no-op /theme beat.",
          "is_bot": false,
          "headline": "demo: start the demo in the Dracula theme (colorful gradient logo)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:35:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca9f1aa542bfe59a6df7ef2b11c330feeceade55",
          "body": null,
          "is_bot": false,
          "headline": "chore: regenerate demo.gif [skip ci]",
          "author_name": "mustachius",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:28:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f2e2d65e0201ba5bc86f163b1b17aa823141a816",
          "body": "…r is broken)\n\ncharmbracelet/vhs-action@v2 fails with 'Failed to install ffmpeg': it hardcodes an ffmpeg n5.1 asset name that BtbN/FFmpeg-Builds no longer ships. Install ffmpeg (apt), ttyd (release binary), and VHS + taskframe (go install) ourselves. Also trigger on changes to the workflow itself.",
          "is_bot": false,
          "headline": "ci(vhs): install ffmpeg/ttyd/vhs directly (vhs-action ffmpeg installe…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T20:25:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "854643785a2119b00df1dbdcf74fbf9f0d57062f",
          "body": null,
          "is_bot": false,
          "headline": "docs: add VHS demo tape + CI to render demo.gif for the README",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T18:33:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8f81cd93c5df8feafa81b4a60f25813f193f7fa8",
          "body": "…ht themes",
          "is_bot": false,
          "headline": "feat(ui): add dracula, catppuccin, nord, gruvbox, solarized, tokyonig…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T18:31:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2b6e943195b603e67fc7f4b49d68fb21ccab99fd",
          "body": "The activity-log entry for an added note used to include the note's raw body,\nso the markdown source (asterisks) showed up literally right below the rendered\nNotes section, making it look like nothing rendered. History now just records\n\"note added\"; the note itself is shown, rendered, in the Notes section.",
          "is_bot": false,
          "headline": "fix: don't repeat raw note text in the History log",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T18:11:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "138adc02123ad3c2d594665c7a8d264f5d1d12b9",
          "body": "Notes shown in the task detail (not only the read view) are now rendered as\nmarkdown, so bold/lists/etc. appear where you naturally open the task. The\nactivity-log/History line keeps the raw note text (it is an audit trail).\nRenderMarkdown also forces a truecolor profile when detection reports Ascii\nbut the rest of the UI is clearly in color (an alt-screen detection miss),\nso notes actually render styled.",
          "is_bot": false,
          "headline": "feat: render task notes as markdown in the detail views (REPL + TUI)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T17:44:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9422a43589993aba718ea30763e9c1761ec47e0a",
          "body": "RenderMarkdown relied on glamour's own auto-detection, which could resolve to\nno color and leave literal ** markers instead of bold. It now uses the same\ncolor profile lipgloss uses (the one that already renders the gradient), so\nnotes render consistently wherever the UI shows color.",
          "is_bot": false,
          "headline": "fix(ui): pin glamour to lipgloss's color profile for markdown",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T17:31:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82d326b5b6f7b97834a49d9003627bcbd8e7d431",
          "body": "…nica)\n\nAdds github.com/charmbracelet/harmonica and a shared scroller that wraps a\nviewport: the viewport still computes and clamps the target offset, and a\nspring animates only the displayed offset toward it (with momentum on\nrepeated keys). A reduceMotion flag (set in tests) makes scrolling instant so\nthe synchronous smoke tests stay fast and deterministic. TUI only; the\nnon-alt-screen REPL is unchanged.",
          "is_bot": false,
          "headline": "feat(tui): spring-eased scrolling in the detail and read views (harmo…",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T17:17:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fd36908b10b2fbe817d18f9c2b7b2a6b7a993585",
          "body": "Adds github.com/charmbracelet/glamour and a shared ui.RenderMarkdown helper\n(cached term renderer, auto/notty style, string-only to keep internal/ui at\nthe bottom of the graph). Notes stay plain text in the DB; only the display\nchanges.\n\n- TUI: a new full-screen Read modal (key R) renders the task t\n[…]\n\n  and each note as a timestamped section, scrollable via viewport.\n- REPL: a new `read <id>` command renders the notes as markdown into the\n  scrollback. Both wired through i18n and the help screens.",
          "is_bot": false,
          "headline": "feat: Glow-style markdown read view for task notes (glamour)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T17:00:46Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d9642aba075527e1edf944794a8ea74087477260",
          "body": "The classic TUI status line now shows the active sort mode on the right,\nso the current ordering is visible at a glance; the left side (task count,\nsearch, last status) truncates to yield space when the terminal is narrow.",
          "is_bot": false,
          "headline": "feat(tui): right-aligned sort indicator in the status bar",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:37:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d1600c4e63e79ea2e3b32f31bcb3685a5e99ae05",
          "body": "The default theme paints no background; its light-gray chrome now uses\nlipgloss.AdaptiveColor so it stays legible on a light-background terminal.\nDark-terminal appearance is unchanged; colored accents are untouched.",
          "is_bot": false,
          "headline": "feat(ui): adaptive grays so the dark theme reads on light terminals",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:35:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "06aff92b133d49fca82e23adaf94bf264ba46db6",
          "body": "Replaces the manual scroll math in the REPL and TUI detail views with a\nviewport.Model, fixing off-by-one clamping and adding pgup/pgdown/home/end\nfor free. The list overlay keeps its cursor-based windowing.",
          "is_bot": false,
          "headline": "feat(ui): scroll the task detail with bubbles/viewport",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:34:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3d17c07022770c3f68e4854cd82ba37c4839af0c",
          "body": null,
          "is_bot": false,
          "headline": "chore: keep CLAUDE.md local-only (untrack + gitignore)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:24:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3a04fd37e42c1cbff11edb66fe471fae1ef1ba40",
          "body": null,
          "is_bot": false,
          "headline": "feat(ui): make the logo gradient vertical (top-to-bottom)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:22:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0af7dac43e57c1d6bcf9c835375a9cf5e6f06e7e",
          "body": "- GradientLine helper colors the TASKFRAME wordmark per column between two\n  hex endpoints (per-theme; mono themes ramp within their hue). Truecolor,\n  downsamples on limited terminals.\n- ProgressBar helper renders a filled/empty block bar from a fraction.\n- show a subtask completion bar in the REPL and TUI detail views; the TUI\n  detail now loads and lists subtasks too.",
          "is_bot": false,
          "headline": "feat(ui): gradient logo and subtask progress bars",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T16:06:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69868fc676968bfd125ffa11c557395a5f5a0403",
          "body": null,
          "is_bot": false,
          "headline": "fix: keep REPL prompt input inside the box on wide terminals",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T15:59:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "45daf1cb0bbeb8dfa2016bda605e0da8943c9d0c",
          "body": null,
          "is_bot": false,
          "headline": "docs: add MIT license",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T15:32:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ffc87580b03039a124b63ba8e37c95d19670949c",
          "body": null,
          "is_bot": false,
          "headline": "chore: rename module path to github.com/mustachius/taskframe",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T15:09:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2e1cba78a9e52885467c6b3cec55af717e38ebcc",
          "body": "Simplifica a saida para ASCII puro e reescreve a documentacao.\n\n- substitui os glifos decorativos de status por marcadores ASCII: as\n  mensagens de sucesso ficam sem prefixo, erros usam \"x\", tarefa ativa\n  usa [>] e recorrente usa ~ (ja eram os equivalentes do modo --ascii).\n- enxuga alguns comentar\n[…]\nmuns: features,\n  instalacao, uso, interfaces (REPL/CLI/TUI), tokens e datas, idioma,\n  temas, configuracao, dados e desenvolvimento.\n\nbuild + vet + gofmt + testes verdes; saida verificada no binario.",
          "is_bot": false,
          "headline": "cleanup: plain-ASCII output markers + English README",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T15:05:17Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "134c8e469b2ba81cb66635e073d2bebbd0aa7b1b",
          "body": "Torna o ingles o idioma padrao do TaskFrame (maior alcance do repo) e\nadiciona um comando para alternar para pt-br.\n\n- novo pacote leaf internal/i18n: catalogo de mensagens da camada de\n  apresentacao (map[string][2]string, [0]=en canonico, [1]=pt-br) com\n  Lang.T/Tf; helpers Normalize/Next. Nao imp\n[…]\n\n  novo internal/i18n test garante catalogo completo (en+pt) e fallback.\n\nbuild + vet + gofmt + testes verdes; verificado no binario (CLI en/pt,\n--lang sobrepoe setting, banner/help nos dois idiomas).",
          "is_bot": false,
          "headline": "i18n: ingles como idioma padrao + toggle pt-br",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T14:43:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f44955c14de9307123483250fd6bd1ff89ed453f",
          "body": "Substitui o banner (estrela + wordmark espacada) por um logo grande do\nnome do projeto em ASCII, estilo ANSI Shadow, colorido com o accent do\ntema. Sob --ascii usa um fallback figlet \"Standard\" de largura 1 para\nconhost legado. Mantem o subtitulo \"tarefas no terminal\".",
          "is_bot": false,
          "headline": "logo: TASKFRAME em ASCII art (ANSI Shadow) com fallback --ascii",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-14T14:05:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4e3e3d0e8d8b180f2cb12cb69d0a73d58e32cb9b",
          "body": "Antes, edit <id> +tag substituía todo o conjunto de tags. Agora acumula:\ntask.MergeTags(existentes, add, remove) mantém as antigas, soma as +tag e\ntira as -tag (dedup, ordem preservada). cmdEdit passa a capturar o filtro\ndo ParseTokens para pegar as ExcludeTags (-tag).\n\nEx.: edit 1 +casa +mercado  (mantém as que já tinha)\n     edit 1 -urgente        (remove só essa)\n\nTestes: MergeTags (add/remove/dedup/vazio) e REPL edit acumula/remove tags.",
          "is_bot": false,
          "headline": "edit: +tag adiciona e -tag remove (não sobrescreve mais)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T17:40:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "601357837babe97dbdb01b111cdba165d35d1632",
          "body": "O import só entrava em banco vazio, o que impedia sincronização recorrente.\nAgora store.Import(d, replace) — com replace=true limpa tasks/notes/activity/\ntags na mesma tx (defer_foreign_keys) antes de restaurar, preservando ids\n(parent/notas/undo seguem válidos). CLI: import [--replace|-r] <arquivo>\n[…]\nh;\nPC B `pull`, `import --replace sync.json`.\n\nTeste: import --replace num banco não-vazio substitui e restaura exatamente;\nos testes de import em banco vazio (e a recusa sem --replace) seguem verdes.",
          "is_bot": false,
          "headline": "import --replace: sobrescrever banco para sync via git",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T17:22:36Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "39040261583466b6dd532a92f3a454575511641b",
          "body": "Redo completo sobre o activity log, com semântica padrão de editor. O\nTaskwarrior não tem redo — aqui foi viabilizado por marcadores.\n\nMecanismo (store/activity.go):\n- Marcadores kind='undo'|'redo' cujo field guarda o op_id afetado.\n  lastMarkerExpr dá o marcador mais recente de um op: \"aplicado\" se\n[…]\nção por op novo, nada-a-refazer; REPL redo reconclui. Os testes de\nundo existentes seguem verdes.\n\nDoc: CLAUDE.md atualizado (estado v4 + decisão de audit log com undo/redo,\nsettings/contexts/config).",
          "is_bot": false,
          "headline": "Taskwarrior F5: redo (desfazer o desfazer)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T15:03:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a64f767e96315b8ecaec85e03cdcff46869924f7",
          "body": "Permite ajustar defaults e a fórmula de urgência sem recompilar, como o\n.taskrc do Taskwarrior.\n\ninternal/config: config.json (zero-dep) em %APPDATA%\\taskframe\\config.json,\noverride por TASKFRAME_CONFIG. Campos: theme, sort, urgency (mapa de\ncoeficientes). Arquivo ausente = zero config; JSON malform\n[…]\n no próximo boot.\n\nTestes: config.Load (ausente/válido/malformado); ConfigureUrgency\n(override aplica, não-especificado mantém default, chave desconhecida\nignorada, reconfigura a partir dos defaults).",
          "is_bot": false,
          "headline": "Taskwarrior F4: arquivo de config (.taskrc)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T14:54:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ce70162307153fd557cbd35d7580ae483c3eef26",
          "body": "Marca uma tarefa como em andamento, como o `task start`/`task stop` do\nTaskwarrior — some urgência e ganha a tag virtual/report ACTIVE.\n\nEsquema/modelo:\n- Migration 3 (aditiva): ALTER TABLE tasks ADD COLUMN start TEXT.\n- Task.Start *time.Time + Task.IsActive(); incluído no scan, nos 3 SELECTs\n  (Get\n[…]\n/CLI; linha\n\"iniciada ▶ <data>\" no detalhe do REPL.\n\nTestes: store (start/stop, urgência sobe, ActiveOnly, undo reverte start\ne stop, export/import preserva start); REPL (start ativa + report active).",
          "is_bot": false,
          "headline": "Taskwarrior F3: start/stop (tarefa ativa)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T14:51:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e80fbb935d4ad0172e63c5d3aff93c2c523e2e5a",
          "body": "Um contexto é um filtro nomeado que passa a valer em toda listagem até\nser desativado — como o `task context` do Taskwarrior.\n\nStore (internal/store/context.go), sobre a tabela settings (preferência\nde máquina: não loga em activity, fora do export):\n- ActiveContext/SetActiveContext, DefineContext/Co\n[…]\n (ativa, valida que existe),\ncontext none, context delete <nome>.\n\nTestes: store (define/ativa/ContextFilter/delete limpa ativo); REPL\n(contexto filtra a lista, título mostra @nome, nocontext ignora).",
          "is_bot": false,
          "headline": "Taskwarrior F2: contexts (filtro default salvo)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T14:43:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "51044bf5691ac17ac5b76a18b2ace356a9fdb6e5",
          "body": "Base da gramática estilo Taskwarrior, compartilhada por CLI e REPL.\n\nSeleção:\n- task.ParseIDSpec: aceita \"1\", \"1,5\", \"1-3\", \"1-3,5\" (dedup, ordem\n  preservada, cap de range). Substitui os dois parseIDs duplicados de\n  CLI e REPL; done/del passam a aceitar ranges e listas.\n\nFiltros:\n- Filter.ExcludeT\n[…]\n filho sob o cursor via input\n  inline (modeAddChild), sem digitar id.\n\nTestes: ParseIDSpec, -tag/status:, reports/Merge, List ExcludeTags,\nreport abre overlay, done por range, add-child sob o cursor.",
          "is_bot": false,
          "headline": "Taskwarrior F1: ranges de id, filtros com negação, reports nomeados",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T14:37:42Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "016e561352d8c39b4ee68c00779b14e1b09f8b3f",
          "body": "Subtarefas já existiam no núcleo (parent_id, BuildTree, CheckMoveCycle,\nundo de reparent) e na TUI clássica, mas o REPL — a interface padrão —\nmal as expunha. Este commit traz essa UX ao REPL e uniformiza a árvore\nentre REPL e CLI.\n\nNúcleo:\n- store.Children(parentID): filhos diretos não-deletados, o\n[…]\nssa a usar os mesmos conectores de árvore do REPL.\n\nTUI clássica: inalterada (referência).\n\nTestes: store.Children; REPL sub/add-validado, flatten+collapse, árvore no\noverlay e detalhe com pai/filhos.",
          "is_bot": false,
          "headline": "Subtarefas no REPL + paridade na CLI",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-13T13:40:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d4fb499a13d66652b548e93986bd935fe8da7d3",
          "body": "- internal/repl: REPL inline (sem alt-screen), banner com logo, prompt\n  arredondado, saida no scrollback via tea.Println; overlay de lista\n  navegavel + detalhe; comandos naturais + /slash; historico e Tab\n- Norton Commander vira 'taskframe classic'; CLI one-shot inalterada\n- Fase 0 compartilhada: \n[…]\n/ui (tema extraido do\n  tui via shim), store.CheckMoveCycle\n- install.ps1: instala como comando global do usuario (PATH idempotente)\n- ~10 smoke tests do REPL (seam model.transcript); docs atualizadas",
          "is_bot": false,
          "headline": "v3: interface REPL inline estilo Claude Code (novo padrao)",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-12T19:29:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e77959d358d961ac2d155527c5d222e0c20d339f",
          "body": "- 4 temas (dark/borland/green/amber) trocaveis com 't', persistidos em\n  settings (migration 2); padrao novo 'dark' usa o fundo do terminal no\n  lugar do azul ANSI-4 que cansava a vista; --theme e TASKFRAME_THEME\n- Sidebar: filtros virtuais Hoje/Atrasadas/Semana/Aguardando + tags\n- Form/detail: camp\n[…]\nersistida\n- F6/m: mover tarefa (projeto/pai) com validacao de ciclo\n- CLI export/import JSON com ids preservados (undo sobrevive ao restore)\n- CI GitHub Actions (vet+test ubuntu/windows, gofmt ubuntu)",
          "is_bot": false,
          "headline": "v2: sistema de temas, filtros virtuais, sort, mover, export/import",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-12T13:20:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7e9a24a3166e74536e125a195432a65c172c7bac",
          "body": "Go + Bubble Tea + SQLite (modernc, sem CGo). TUI de dois paineis com\nbordas duplas e F-key bar; CLI de captura rapida estilo taskwarrior.\nTarefas, subtarefas aninhadas, projetos hierarquicos, notas, activity\nlog completo com undo por op_id, urgency score, recorrencia, filtros\ne busca.",
          "is_bot": false,
          "headline": "TaskFrame v1: gerenciador de tarefas TUI estilo Norton Commander",
          "author_name": "victor.sartor",
          "author_login": "mustachius",
          "committed_at": "2026-07-12T13:09:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 3,
      "commits_last_year": 73,
      "latest_release_at": "2026-07-17T12:40:35Z",
      "latest_release_tag": "v0.2.1",
      "releases_from_tags": true,
      "days_since_last_push": 4,
      "active_weeks_last_year": 2,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 1.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 28,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/mustachius/taskframe",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/mustachius/taskframe",
          "is_deprecated": false,
          "latest_version": "v0.2.1",
          "repository_url": "https://github.com/mustachius/taskframe",
          "versions_count": 3,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-17T12:40:35Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 4,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [
          {
            "date": "2026-07-17",
            "count": 2
          },
          {
            "date": "2026-07-18",
            "count": 1
          },
          {
            "date": "2026-07-20",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 4,
        "total_stars": 4
      },
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 32071,
      "source_files_sampled": 73,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_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": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/glamour",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.0"
        },
        {
          "name": "github.com/charmbracelet/harmonica",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.2.0"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.1-0.20250404203927-76690c660834"
        },
        {
          "name": "github.com/charmbracelet/x/ansi",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.11.6"
        },
        {
          "name": "github.com/muesli/termenv",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.16.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.53.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "mustachius",
          "commits": 73,
          "avatar_url": "https://avatars.githubusercontent.com/u/10211078?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "vhs.yml"
      ],
      "has_docs_dir": false,
      "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": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": null,
            "reason": "no pull request found",
            "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": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 10,
            "reason": "all dependencies are pinned",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "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": null,
            "reason": "no releases found",
            "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": "ccda7206b0f1b7be5bd314a6741505d75b7ad181",
        "ran_at": "2026-07-21T21:17:14Z",
        "aggregate_score": 3.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/mustachius/taskframe",
    "host": "github.com",
    "name": "taskframe",
    "owner": "mustachius"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 43,
      "inputs": {
        "security": 34,
        "vitality": 68,
        "community": 28,
        "governance": 33,
        "engineering": 48
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "moderate",
        "name": "Vitality",
        "value": 68,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 54,
            "inputs": {
              "commits_last_year": 73,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 2
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "2/52 weeks with commits",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "73 commits in the last year",
                "points": 16.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 73
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 3,
              "latest_release_tag": "v0.2.1",
              "releases_from_tags": true,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 1.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "3 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~1.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 1.4
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 28,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 8,
            "inputs": {
              "forks": 0,
              "stars": 4,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "4 stars",
                "points": 7.7,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 33,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "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": "at_risk",
            "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": 47,
            "inputs": {
              "followers": 8,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "mustachius",
              "public_repos": 14,
              "account_age_days": 4235
            },
            "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": "8 followers of mustachius",
                "points": 6.9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 8,
                      "login": "mustachius"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "14 public repos, account ~11 yr old",
                "points": 20.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 14
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 11
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 92,
            "inputs": {
              "packages": [
                "github.com/mustachius/taskframe"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "3 published versions",
                "points": 12,
                "status": "partial",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 48,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "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": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "topics": [],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": 0,
                "status": "missed",
                "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": 34,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 34,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3.4
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "all dependencies are pinned",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "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": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 63,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "73 of 73 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 73,
                      "sampled": 73
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 66,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "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": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "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 73",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "sampled": 73
                    }
                  }
                ],
                "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": "all dependencies are pinned",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 32071,
              "source_files_sampled": 73,
              "oversized_source_files": 0
            },
            "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": "0/73 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 73,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-21T21:17:18.910328Z",
  "schema_version": "0.23.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/m/mustachius/taskframe.svg",
  "full_name": "mustachius/taskframe",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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