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

zendev-sh / goai

Go AI SDK, the Go way. One unified API across 21+ providers. Streaming, structured output, MCP support, stdlib only. Go AI SDK for AI applications inspired by Vercel AI SDK.

GoMIT★ 171 зірка⑂ 24 форкиз бер. 2026 р.Переглянути на GitHub ↗
ТипБібліотекаяк це визначено

zendev-sh/goai має індекс здоров’я 78 зі 100, що відповідає смузі «Добрий». Найвищий показник — Vitality (86/100), найнижчий — Security (37/100). Останнє оновлення — сьогодні. Більшість нещодавньої роботи виконує один учасник.

78
загалом / 100
Добрий

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

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

78
Винятковий93-100Верхній щабель реєстру (≈ топ-5%); відповідає практично всім перевіреним критеріям
Відмінний80-92Сильний за всіма напрямами; незначні прогалини
Добрий65-79Здоровий; прогалини обмежені та керовані
Помірний50-64Прийнятний, але з помітними прогалинами; рекомендовано перевірку
Слабкий35-49Суттєві недоліки в кількох сферах
У зоні ризику20-34Суттєві слабкі місця; впровадження потребує обережності
Критичний1-19Серйозні проблеми (покинутий, єдиний мейнтейнер, без базової гігієни)
ЖиттєздатністьСпільнота тавпровадженняСталість таврядуванняІнженернаякістьБезпекаГотовність доШІ

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

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

Зважений загальний бал 67 калібровано до 78 за шкалою опублікованого індексу (калібрування реєстру 2026-08-02).

Власність

zendev.shОрганізація
5 підписників3 публічні репозиторіїз лют. 2026 р.

За цим репозиторієм стоїть організація — спільна, підзвітна опіка, здатна пережити будь-якого окремого мейнтейнера.

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Gogithub.com/zendev-sh/goaiv0.9.2-460 днів тому

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

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

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

86Відмінний · 21% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 0 дн. тому
11.8/36Ритм комітів — 17/52 тижнів із комітами
18/18Обсяг комітів — 224 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year224
human_commit_share0,84
days_since_last_push0
active_weeks_last_year17
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 46 релізів
36/36Свіжість релізів — останній реліз 0 дн. тому
27/27Ритм релізів — реліз кожні ~5,8 дн.
0/10OpenSSF Scorecard: Signed-Releases — немає даних
Використані вхідні дані
releases_count46
latest_release_tagv0.9.2
releases_from_tagsні
days_since_latest_release0
mean_days_between_releases5,8
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Signed-Releases. Залишкові ваги перенормовано.

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

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

62Помірний · 17% загального індексу
Як обчислюється оцінка
36.2/60Зірки — 171 зірок
11.3/25Форки — 24 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks24
stars171
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Як обчислюється оцінка
22.5/22.5README
22.5/22.5Ліцензія — визнана ліцензія (MIT)
18/18Настанови CONTRIBUTING
0/13.5Кодекс поведінки
0/7.2Шаблон issue
6.3/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
readme_badges
has_contributingтак
has_issue_templateні
has_code_of_conductні
readme_badge_services
has_pull_request_templateтак

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

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

59Помірний · 23% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
2.5/22.5Розподіл комітів — головний контриб’ютор — автор 89% комітів
13.5/13.5Широта контриб’юторів — 10 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled10
top_contributor_share0,89
Як обчислюється оцінка
42/42Вирішення issue — закрито 100% issue
26.7/30Прийняття PR — злито 97/109 вирішених PR
0/13Newcomer PR acceptance — за 30 дн. не вирішено жодного PR від новачка
6/15OpenSSF Scorecard: Code-Review — Found 12/30 approved changesets -- score normalized to 4
Використані вхідні дані
merged_prs97
open_issues0
closed_issues21
prs_merged_7d
prs_decided_7d
prs_merged_30d
prs_decided_30d
issue_closed_ratio1
closed_unmerged_prs12
first_time_authors_30d
first_time_prs_merged_30d
first_time_prs_decided_30d
Виключено з оцінювання (немає даних або не застосовно): newcomer_pr_acceptance. Залишкові ваги перенормовано.
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
5.6/25Охоплення власника — 5 підписників у zendev-sh
5.3/25Послужний список — 3 публічних репозиторіїв, вік облікового запису ~0 р.
Використані вхідні дані
followers5
owner_typeOrganization
is_verified
owner_loginzendev-sh
public_repos3
account_age_days165

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

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

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

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

81Відмінний · 19% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 4 процес(ів) CI
24/24Наявні тести
0/16Конфігурація лінтера
0/9.6Pre-commit-хуки
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configні
has_precommit_configні

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

100Винятковий
Як обчислюється оцінка
30/30README
25/25Каталог документації
15/15Сайт документації / домашня сторінка — https://goai.sh/
10/10Опис репозиторію
10/10Теми — 19 тем
10/10Wiki
Використані вхідні дані
topicsai, ai-agents, ai-tools, llm, sdk-go, ai-sdk, anthropic, azure-op, bedro, cerebra, gemini, minimax, openai, openrouter, vercel, vertex-ai, go-ai-sdk, goai, zenflow
has_wikiтак
homepagehttps://goai.sh/
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

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

37Слабкий · 16% загального індексу

Стан безпеки

37Слабкий
Як обчислюється оцінка
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
2.5/2.5CI-Tests — 22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
3/7.5Code-Review — Found 12/30 approved changesets -- score normalized to 4
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
0/10Dangerous-Workflow — немає даних
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — немає даних
0/5Pinned-Dependencies — немає даних
0/5SAST — немає даних
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — немає даних
0/7.5Token-Permissions — немає даних
0.8/7.5Vulnerabilities — 9 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated12
scorecard_versionv5.5.0
checks_inconclusive6
scorecard_aggregate3,7
Виключено з оцінювання (немає даних або не застосовно): dangerous_workflow, packaging, pinned_dependencies, sast, signed_releases, token_permissions. Залишкові ваги перенормовано.

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

Наскільки репозиторій оснащений для розробки та супроводу за участі ШІ-агентів? Має свідомо малу вагу (4%): агентний інструментарій — реальний сигнал супроводу, але репозиторій без нього все одно може отримати 100/100.

79Добрий · 4% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — AGENTS.md, CLAUDE.md
15/15Машиночитана документація (llms.txt) — llms.txt наявний
40/40Читабельна історія комітів — намір зазначено у 84 з 84 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtтак
legible_history_share1
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes4 968
Як обчислюється оцінка
18/18Розгортання однією командою — Makefile, bench/Makefile
22/22Автоматизовані тести
0/11Конфігурація лінтера / форматера
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — lockfile
2/10Підтверджена практика роботи з агентами — 1 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
0/10OpenSSF Scorecard: Pinned-Dependencies — немає даних
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum, package-lock.json
has_dockerfileні
typed_languageтак
bootstrap_filesMakefile, bench/Makefile
has_devcontainerні
has_linter_configні
typecheck_configs
agent_commit_share0,01
toolchain_manifestsbench/go/go.mod, examples/langfuse/go.mod, examples/otel/go.mod, go.mod, observability/langfuse/go.mod, observability/otel/go.mod
dependency_bot_commit_share0
Виключено з оцінювання (немає даних або не застосовно): OpenSSF Scorecard: Pinned-Dependencies. Залишкові ваги перенормовано.
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
51.6/55Керовані розміри файлів — 13/210 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes212 337
source_files_sampled210
oversized_source_files13
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalні
api_schema_files

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

171зірок GitHub
10контриб'юторів
224комітів за останні 12 місяців
0днів від останнього пушу
46релізів
1бас-фактор
0відкритих issue
Go, npmпакетних екосистем

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

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Докладніше

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

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

048121620242422026-032026-052026-07
Мажорні 0Мінорні 5Патчі 38
OpenSSF Scorecard 3.7 / 10
3.7сукупно

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests22 out of 22 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
4Code-ReviewFound 12/30 approved changesets -- score normalized to 4
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
н/дDangerous-Workflowinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
н/дPackaginginternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
н/дPinned-Dependenciesinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
н/дSASTinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
0Security-Policysecurity policy file not detected
н/дSigned-Releasesno releases found
н/дToken-Permissionsinternal error: internal error: invalid GitHub workflow: :67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]
1Vulnerabilities9 existing vulnerabilities detected
Прямі залежності 3
РеєстрПакетОбмеження версіїМаніфест
Gogo.uber.org/goleakv1.3.0go.mod
Gogolang.org/x/oauth2v0.36.0go.mod
npmlucide-vue-next^0.577.0package.json
Усі залежності не зібрано

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

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [
        "ai",
        "ai-agents",
        "ai-tools",
        "llm",
        "sdk-go",
        "ai-sdk",
        "anthropic",
        "azure-op",
        "bedro",
        "cerebra",
        "gemini",
        "minimax",
        "openai",
        "openrouter",
        "vercel",
        "vertex-ai",
        "go-ai-sdk",
        "goai",
        "zenflow"
      ],
      "is_fork": false,
      "size_kb": 23178,
      "has_wiki": true,
      "homepage": "https://goai.sh/",
      "languages": {
        "Go": 3209182,
        "Shell": 19464,
        "Makefile": 1829,
        "TypeScript": 9056
      },
      "pushed_at": "2026-07-28T21:02:32Z",
      "created_at": "2026-03-17T21:57:16Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-28T21:03:18Z",
      "description": "Go AI SDK, the Go way.  One unified API across 21+ providers. Streaming, structured output, MCP support, stdlib only. Go AI SDK for AI applications inspired by Vercel AI SDK.",
      "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": "zendev.sh",
      "type": "Organization",
      "login": "zendev-sh",
      "company": null,
      "location": null,
      "followers": 5,
      "avatar_url": "https://avatars.githubusercontent.com/u/261401316?v=4",
      "created_at": "2026-02-13T10:32:24Z",
      "is_verified": null,
      "public_repos": 3,
      "account_age_days": 165
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.9.2",
          "kind": "patch",
          "published_at": "2026-07-28T21:00:18Z"
        },
        {
          "tag": "v0.9.1",
          "kind": "patch",
          "published_at": "2026-07-27T11:34:10Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-07-20T10:30:49Z"
        },
        {
          "tag": "v0.8.6",
          "kind": "patch",
          "published_at": "2026-07-08T10:07:27Z"
        },
        {
          "tag": "v0.8.5",
          "kind": "patch",
          "published_at": "2026-06-20T12:26:55Z"
        },
        {
          "tag": "v0.8.4",
          "kind": "patch",
          "published_at": "2026-06-12T03:54:31Z"
        },
        {
          "tag": "v0.8.3",
          "kind": "patch",
          "published_at": "2026-06-08T01:47:52Z"
        },
        {
          "tag": "v0.8.2",
          "kind": "patch",
          "published_at": "2026-06-07T12:29:24Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2026-06-07T09:23:23Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2026-06-07T02:09:05Z"
        },
        {
          "tag": "v0.7.11",
          "kind": "patch",
          "published_at": "2026-05-30T23:02:10Z"
        },
        {
          "tag": "v0.7.10",
          "kind": "patch",
          "published_at": "2026-05-28T23:57:13Z"
        },
        {
          "tag": "v0.7.9",
          "kind": "patch",
          "published_at": "2026-05-28T23:20:54Z"
        },
        {
          "tag": "v0.7.8",
          "kind": "patch",
          "published_at": "2026-05-27T23:25:40Z"
        },
        {
          "tag": "v0.7.7",
          "kind": "patch",
          "published_at": "2026-05-16T23:03:17Z"
        },
        {
          "tag": "v0.7.6",
          "kind": "patch",
          "published_at": "2026-05-08T10:24:59Z"
        },
        {
          "tag": "v0.7.5",
          "kind": "patch",
          "published_at": "2026-05-07T10:10:13Z"
        },
        {
          "tag": "v0.7.4",
          "kind": "patch",
          "published_at": "2026-05-03T11:01:24Z"
        },
        {
          "tag": "v0.7.3",
          "kind": "patch",
          "published_at": "2026-04-27T05:43:17Z"
        },
        {
          "tag": "v0.7.2",
          "kind": "patch",
          "published_at": "2026-04-23T03:18:30Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-04-19T01:35:06Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-04-19T00:13:58Z"
        },
        {
          "tag": "v0.6.7",
          "kind": "patch",
          "published_at": "2026-04-15T03:50:47Z"
        },
        {
          "tag": "v0.6.6",
          "kind": "patch",
          "published_at": "2026-04-13T23:47:15Z"
        },
        {
          "tag": "v0.6.5",
          "kind": "patch",
          "published_at": "2026-04-12T09:39:26Z"
        },
        {
          "tag": "v0.6.4",
          "kind": "patch",
          "published_at": "2026-04-10T03:46:59Z"
        },
        {
          "tag": "v0.6.3",
          "kind": "patch",
          "published_at": "2026-04-09T03:09:02Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-04-08T21:44:27Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-04-07T08:26:40Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-04-05T07:21:09Z"
        },
        {
          "tag": "v0.5.10",
          "kind": "patch",
          "published_at": "2026-04-04T10:24:32Z"
        },
        {
          "tag": "v0.5.9",
          "kind": "patch",
          "published_at": "2026-04-04T08:46:22Z"
        },
        {
          "tag": "v0.5.8",
          "kind": "patch",
          "published_at": "2026-04-02T07:51:00Z"
        },
        {
          "tag": "v0.5.7",
          "kind": "patch",
          "published_at": "2026-04-02T02:21:38Z"
        },
        {
          "tag": "v0.5.6",
          "kind": "patch",
          "published_at": "2026-04-02T02:02:18Z"
        },
        {
          "tag": "v0.5.5",
          "kind": "patch",
          "published_at": "2026-04-01T23:38:12Z"
        },
        {
          "tag": "v0.5.4",
          "kind": "patch",
          "published_at": "2026-03-31T01:59:28Z"
        },
        {
          "tag": "v0.5.3",
          "kind": "patch",
          "published_at": "2026-03-30T09:11:23Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2026-03-29T12:22:01Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2026-03-27T02:51:06Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-03-26T11:19:05Z"
        },
        {
          "tag": "v0.4.4",
          "kind": "patch",
          "published_at": "2026-03-25T10:49:57Z"
        },
        {
          "tag": "v0.4.3",
          "kind": "patch",
          "published_at": "2026-03-24T05:39:41Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2026-03-23T07:57:02Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2026-03-23T03:59:41Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-03-17T22:06:48Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "9ee1031a674c6d636bfe941212f76941c473a7d7",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.9.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-28T21:02:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f84e7c70598a22d7f948056786ae0e0f4ef34f64",
          "body": "DiscoverAuth now follows the full MCP authorization discovery chain:\n- reads the resource_metadata pointer from the WWW-Authenticate 401 challenge (RFC 9728 §5.1)\n- probes the path-aware protected-resource well-known (.../oauth-protected-resource/{path})\n- fetches AS metadata from openid-configurati\n[…]\nn, the openid-configuration\nfallback in both forms, and the non-answers that must fall through: a\nProtected Resource document with no authorization_servers, and an empty array.\nPackage coverage 95.9%.",
          "is_bot": false,
          "headline": "feat(mcp): follow the full OAuth discovery chain",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T20:59:57Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3291adcaa7b2d90477f5237a09f9381f59b66671",
          "body": "Responses can return several summary segments under one reasoning item,\ntold apart by summary_index. The deltas of each segment carry no separator:\nthe boundary exists only in that index. Concatenating them therefore runs two\nsummaries together, and since each one tends to open with a bold title, th\n[…]\ny, a lone\nsummary, a second reasoning item starting clean, a first index that is not\nzero, deltas with no reasoning item to track, and that reasoningId still\nreports the index. Package coverage 98.8%.",
          "is_bot": false,
          "headline": "fix(openai): keep the boundary between reasoning summaries",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T20:59:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "17765c647bcf82980d08bf44697f6d2b9a3303cb",
          "body": "Gemini's function_declarations validator rejects \"const\", so it was dropped\nalong with the other unsupported keywords. Dropping it also drops the\nconstraint: a schema that pinned a field to one value now accepts anything of\nthat type, and the model is free to fill it in wrongly.\n\n\"const\" has an exac\n[…]\n a type gets \"string\", which Gemini requires alongside an enum.\n\nThis shows up with MCP tool schemas and discriminated unions, where a const\ntag is what tells the model which variant it is filling in.",
          "is_bot": false,
          "headline": "fix(gemini): rewrite schema \"const\" to a single-value \"enum\"",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T04:10:31Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c9efb630eac0183bad974253e8c2a5f02cef43d8",
          "body": "response.function_call_arguments.delta finalized the call as soon as the\naccumulated buffer parsed as JSON, and then reset that buffer. This assumes\nthe delta that completes the object is the last one for the call. It usually\nis, but nothing guarantees it: any delta that follows -- down to a trailin\n[…]\nbeing dropped.\n\nThe added test drives a delta after the arguments already parse: it emitted\ntwo calls before this change and one after, plus the cancellation path of the\nflush. Package coverage 98.8%.",
          "is_bot": false,
          "headline": "fix(openai): emit a Responses tool call once, not per valid buffer",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T04:10:24Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "686527a4def192da6228645fcd9cad99f2e60921",
          "body": "The Gemini API reports thinking separately in thoughtsTokenCount, and\ntotalTokenCount is prompt + candidates + thoughts. Subtracting thoughts from\ncandidatesTokenCount double-counts them: once thoughts outgrow the answer the\nsubtraction goes negative and OutputTokens clamps to 0, so a reasoning-heavy\nturn reports no output at all.\n\nOutput now maps to candidatesTokenCount directly. ReasoningTokens already\ncarries thoughtsTokenCount, so nothing is lost.",
          "is_bot": false,
          "headline": "fix(google): count output tokens as candidatesTokenCount",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-28T04:10:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "33aea297efcca5a356bd97cbb3a7a39a8c47f82a",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.9.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T11:36:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2c9b39b8d22bb87de3ad586480ce1e9795c0b428",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.10.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-27T11:33:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f67a9929bab8afa06dae73dbadadbccd1c1ffad",
          "body": "Anthropic's prompt caching accepts a `ttl` on the ephemeral cache_control\nmarker, selecting a 5-minute or 1-hour cache lifetime. The SDK always\nemitted the bare marker, so callers were pinned to the 5m default and had\nno way to opt into the 1h TTL, which is the better trade for long-lived\nsystem pro\n[…]\ncaching.go propagation,\nthe option-to-params plumbing, and an end-to-end mock-server check that\nthe TTL reaches the wire. Patch coverage 100%; package coverage unchanged\n(root 97.6%, anthropic 98.0%).",
          "is_bot": false,
          "headline": "feat(anthropic): configurable ephemeral cache TTL (5m/1h)",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-27T11:24:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "42ed186f1e6e4624919bf9af22920cf42d242cb5",
          "body": "A single SSE delta can carry both reasoning and content fields at the\nreasoning-to-answer transition (observed with GLM via NVIDIA NIM).\nParseStream processed content first, which inverts the logical order:\nreasoning must always precede the answer it produces.\n\nThe result is a corrupted chunk order \n[…]\ned for deltas\ncarrying only one of the two fields, which is the common case.\n\nAdds TestParseStream_ReasoningBeforeTextInCombinedDelta, which fails on\nthe previous ordering and passes with this change.",
          "is_bot": false,
          "headline": "fix(openaicompat): emit reasoning before text within a combined delta",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-07-27T11:24:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "869e50543b0451f66064583d7091c96bce45aaaa",
          "body": "- Add v0.9.0 (file upload) to README, docs/index, ROADMAP, homepage\n- Add FileUpload/RemoteRef to API types docs and capabilities tables\n- Add file upload notes to OpenAI/Anthropic/Google/Compat provider docs\n- Fix '22+ providers' → '25+ providers' in LLM context files\n- Add .vibeflow, *.out, docs/drift-report to .gitignore\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "fix: docs drift audit — file upload docs, homepage, gitignore (#116)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-07-20T21:00:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eea8799e3421b1d03480970e92edb4ac5017ea3a",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.9.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-07-20T10:32:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b790921317a3875c19a04531fade2fbab0df1396",
          "body": "…enAI, Anthropic, Gemini) (#115)\n\n- Add FileUpload, RemoteFileRef, FileUploader, FileUploadCapableModel to provider/types.go\n- Add Part.RemoteRef and ModelCapabilities.FileUpload\n- Add ErrFileUploadUnsupported sentinel error\n- OpenAI: multipart upload to /v1/files, RemoteRef → file_id in Responses A\n[…]\nm RemoteRef.Data → inline base64 (no behavioral change)\n- 100% coverage on all new code (unreachable Go stdlib multipart error paths excluded)\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "feat: add provider-neutral file upload and remote file references (Op…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-07-20T10:28:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3d023d6cda69eff78edd5624bf0fedbd2f42e88d",
          "body": "…tion (#112) (#113)",
          "is_bot": false,
          "headline": "fix: OpenRouter reasoning dropped (#111) and server-tool loop termina…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-07-08T10:03:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "40eb6dfff92b007e2388aab234e0485ccd3fefeb",
          "body": "…tion (#112)\n\n#111: Add reasoning field fallback to openaicompat for OpenRouter\n- Add Reasoning field to streaming Delta and non-streaming Message structs\n- Fall back to delta.reasoning / message.reasoning when reasoning_content is empty\n- OpenRouter emits reasoning under reasoning, not reasoning_co\n[…]\nlel for server-executed tools (nothing to execute)\n- Preserve reasoning in continuation messages for server-tool steps\n- Enter streamWithToolLoop when provider-defined tools exist even without Execute",
          "is_bot": false,
          "headline": "fix: OpenRouter reasoning dropped (#111) and server-tool loop termina…",
          "author_name": "Dev Admin",
          "author_login": null,
          "committed_at": "2026-07-08T07:29:56Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a0ff039ca03ba71159ab7569de53382bd302c056",
          "body": null,
          "is_bot": false,
          "headline": "docs: update README and roadmap for v0.8.5",
          "author_name": "B",
          "author_login": "vietanh85",
          "committed_at": "2026-06-21T08:18:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4920e1a14b239303b1816d43055838465e22f596",
          "body": null,
          "is_bot": false,
          "headline": "feat(errors): enhance error handling for embedded error messages (#110)",
          "author_name": "Nehme Roumani",
          "author_login": "nehmeroumani",
          "committed_at": "2026-06-20T21:46:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b48faf7d22a370ab892e04fd5078866ef96a71e",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.5",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-20T12:26:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8563bccfc795b13558f089e9d3b913cbcc8de56e",
          "body": "…07) (#109)\n\nBuffer.com MCP server rejects tools/call when the arguments field is\nabsent. CallTool now initializes nil args to an empty map and always\nserializes arguments as an object.\n\nAlso fixes a flaky test (race/mid-loop-error-monotonic-step) that\nasserted pollers must observe every intermediate step value, which is\nnot guaranteed when the error path completes synchronously.\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "fix: ensure CallTool sends arguments as {} instead of omitting it (#1…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-20T12:23:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "053026ccdb7c154d4a2577924052e06dea066e7d",
          "body": "…Max/default from schemas (#108)\n\nGemini's function_declarations API rejects JSON Schema keywords like\npropertyNames, patternProperties, const, exclusiveMinimum,\nexclusiveMaximum, and default. MCP tool schemas (e.g. firecrawl) commonly\ncarry these, causing 'Unknown name' errors.\n\nAdd all six to the existing strip list in sanitizeImpl alongside\nadditionalProperties and format.\n\nFixes zendev-sh/zenflow#14\n\nCo-authored-by: Anh Nguyen Viet <AnhNV16@vibeflow.local>",
          "is_bot": false,
          "headline": "fix(gemini): strip propertyNames/patternProperties/const/exclusiveMin…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-20T11:55:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0108fb761bb688c8348fd987a2bf842e428102a1",
          "body": "Requesty (https://requesty.ai) is an OpenAI-compatible LLM gateway. This adds a\nnative provider package mirroring the existing openrouter provider, built on\ninternal/openaicompat -- a /chat/completions endpoint at\nhttps://router.requesty.ai/v1, provider/model model naming, and the same\noptional HTTP\n[…]\nrified: go build ./..., go test ./... (100% coverage on the new package),\ngo vet, golangci-lint (0 issues), gofmt clean. Also live-tested against\nhttps://router.requesty.ai/v1 with openai/gpt-4o-mini.",
          "is_bot": false,
          "headline": "feat: add Requesty provider (#106)",
          "author_name": "Thibault Jaigu",
          "author_login": "Thibaultjaigu",
          "committed_at": "2026-06-20T11:05:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dd18d60a359a5bf940910ff04bd446ce497c09b1",
          "body": "… (#105)\n\nNative structured-output mode (structuredOutputMode=\"outputFormat\")\nemitted the schema as the top-level output_format request field, which\nthe Messages API now rejects: \"output_format: This field is deprecated.\nUse 'output_config.format' instead.\"\n\nbuildRequest now nests the schema under o\n[…]\ntptest handlers use only non-fatal\nassertions so a missing field can no longer panic the handler goroutine\ninto a client-side EOF.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(anthropic): send native structured output as output_config.format…",
          "author_name": "Claudiu",
          "author_login": "claudiunicolaa",
          "committed_at": "2026-06-19T12:32:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e6e2fc69c7ce90ac0624d7e69af14824386dbd47",
          "body": null,
          "is_bot": false,
          "headline": "Add Reasoning field to stepResult (#103)",
          "author_name": "Kadir Gün",
          "author_login": "kadirgun",
          "committed_at": "2026-06-15T07:38:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "54c8c5dcd64db58b519bb3a738ffdbfdb7e8f0a8",
          "body": null,
          "is_bot": false,
          "headline": "fix: correct YAML indentation in zenflow-review workflow (#100)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-13T05:59:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7294c6817f7c35a4b982fe572355c3c75cf24583",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.4",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-12T03:54:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "016e5f7156d9caf38fd38b486e45af73935d09ce",
          "body": "Replace GEMINI_API_KEY with FPT_API_KEY for the zenflow-review action.\nModel changed from gemini-2.0-flash to Qwen3.6-27B.",
          "is_bot": false,
          "headline": "chore: switch zenflow-review to FPT provider (Qwen3.6-27B) (#99)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-12T03:51:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cf9e3608f37d33e57e6dab88a8faa9bf9442aab9",
          "body": "Add WithRetryObserver callback that fires before each retry attempt,\nallowing callers to log or observe retry progress (attempt, error, delay).\n\n- New RetryObserver type and WithRetryObserver option\n- Observer invoked in withRetry loop before sleep\n- All call sites in generate, object, embed pass observer through\n- Tests for observer invocation and GenerateText integration",
          "is_bot": false,
          "headline": "feat: expose retry steps via RetryObserver (#95) (#98)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-12T03:51:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d4358effc4344ef2a39e4900fdf05681b628ea77",
          "body": "Add tests for the branches introduced in #96 that codecov/patch flagged:\n- complete valid-JSON args buffered before the name, flushed on start\n- the four TrySend context-cancel early-return paths in ParseStream\n\nBrings patch coverage of the streamed tool-call refactor to 100%.",
          "is_bot": false,
          "headline": "test(openaicompat): cover split tool-call stream patch lines (#97)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-11T12:51:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc66bec53741da19136f738da073268810f9cfc5",
          "body": "* fix: preserve split tool call stream metadata\n\n* fix: stabilize streamed tool call IDs",
          "is_bot": false,
          "headline": "fix: preserve split tool call stream metadata (#96)",
          "author_name": "Sebastian Legarraga",
          "author_login": "slegarraga",
          "committed_at": "2026-06-11T11:57:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "74908a92ff793f54490e668b1a3c0b20fc49e98c",
          "body": "Add a redacted_thinking case to the Anthropic streaming switch so the encrypted block (delivered whole in content_block_start) is surfaced as a ChunkReasoning with redactedData metadata and can be replayed on the next turn. Also passes through the adaptive thinking display option.\n\nOriginal work by Nehme Roumani (@nehmeroumani), superseding #93. Adds a coverage test for the context-cancel branch.",
          "is_bot": false,
          "headline": "fix(anthropic): capture redacted_thinking blocks in streaming (#94)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-08T22:56:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9f1d8092da460a021b4ba84414f0126228ee4d54",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.3",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-08T01:47:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7d93751f8d83277f73b24462d12e0ddf0d13405",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.3",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-08T01:45:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8466eedbdf233f44829836f298abb4bd10d5f243",
          "body": "Replace the compat layer with a native /api/chat and /api/embed implementation using net/http. Adds think mode, JSON mode via the format field, reasoning via the native thinking field, bounded reads, and typed HTTP errors. No third-party Ollama SDK; go.mod stays at 1.25.",
          "is_bot": false,
          "headline": "provider/ollama: native API with think mode, no third-party SDK (#92)",
          "author_name": "Bruno Clermont",
          "author_login": "bclermont",
          "committed_at": "2026-06-08T01:30:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df831fb3420f24ce7d3ef95b37db21c388457021",
          "body": "Validate tool name uniqueness in buildToolMap across all tools and all four entry points (GenerateText, StreamText, GenerateObject, StreamObject); transition AgentState to idle on the StreamText validation error.",
          "is_bot": false,
          "headline": "fix: detect duplicate tool names across tool entry points (#91)",
          "author_name": "Bruno Clermont",
          "author_login": "bclermont",
          "committed_at": "2026-06-08T01:30:56Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b82078ae915f2a59b7842091d35ba9d85a2ebb71",
          "body": "The codecov-action uploader aborts before uploading because importing\nCodecov's PGP public key returns no data (\"no valid OpenPGP data found\"),\nso the SHA256SUM signature check fails with \"No public key\". This is an\nupstream issue in the uploader's key fetch, unrelated to coverage or the\ntoken, and it fails CI on every PR.\n\nSet skip_validation: true so the uploader skips the binary integrity\ncheck and proceeds to upload. Uploads remain authenticated via\nCODECOV_TOKEN.",
          "is_bot": false,
          "headline": "ci: skip codecov uploader GPG validation",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T21:59:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3f48788632eb8bb4c9d6a5df6b8202e72d1d80ec",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-07T12:29:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ccbf1bc6b8c0a512c45b9d005d3a786a12325af1",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.2",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T12:27:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7e104924c9a0ec299f16c3723c236a7bfeaccedd",
          "body": "…… (#90)\n\n* fix(provider): populate ToolName on synthetic orphan tool results for Google AI\n\n* fix(provider): add synthetic orphan tool result test and cloneMessages function for improved message handling\n\n* fix(provider): preserve Message.ProviderOptions in cloneMessages\n\ncloneMessages rebuilt Mess\n[…]\ny message lost ProviderOptions, breaking\nanthropic message-level cache control. Copy the whole struct, then clone\nthe Content slice.\n\n---------\n\nCo-authored-by: vietanh85 <vietanh.nguyen.it@gmail.com>",
          "is_bot": false,
          "headline": "fix(provider): populate ToolName on synthetic orphan tool results for…",
          "author_name": "Nehme Roumani",
          "author_login": "nehmeroumani",
          "committed_at": "2026-06-07T12:25:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2af4a72277e7e216630835053707cc87a3cf2974",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.1",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-07T09:23:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0be968d8ce773f9fb4ff15c72702a49d131023a7",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.1",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T09:21:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72481862b459b81e7b3683dddcb605e24b270426",
          "body": "…(#89)\n\nThe Responses API error-event handler overwrote the flat message/code\nwith the nested error object unconditionally, so a partial nested object\n(e.g. a nested code with no message) clobbered a flat message with an\nempty string and lost the detail. Fall back per-field with cmp.Or:\nprefer nested when set, otherwise keep the flat value. Follow-up to #88.",
          "is_bot": false,
          "headline": "fix(openai): preserve flat error fields when nested error is partial …",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T09:11:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7c6afa81146919d88042a375ec0a5eb9780979a1",
          "body": "… events (#88)",
          "is_bot": false,
          "headline": "fix(openai): handle nested error fields in Responses API stream error…",
          "author_name": "Nehme Roumani",
          "author_login": "nehmeroumani",
          "committed_at": "2026-06-07T08:10:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "03a4ab94972b9e0ea5400ec3321035d6ccf27d3f",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.8.0",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-06-07T02:09:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a13785d92f353e8c56a73e61d6936cff05b795b",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.8.0",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T02:06:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f82a2e5c89d440893343c2243df66e568e5ae600",
          "body": "… (#87)\n\nNewTool[In](name, description, execute) builds a Tool from a typed input\nstruct: the JSON Schema is generated via SchemaFrom and the model's raw\narguments are unmarshaled into In before execute runs, so callers no\nlonger hand-write JSON Schema or unmarshal input (issue #83).\n\nMigrate all ex\n[…]\n NewTool, keeping the raw goai.Tool struct form\ndocumented for hand-written schemas and provider-defined tools. Also bump\nexample model ids from gemini-2.0-flash to gemini-3-flash-preview.\n\nCloses #83",
          "is_bot": false,
          "headline": "feat: add NewTool typed constructor and adopt it across examples/docs…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T01:56:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ab9a84e0af9d390f59eda1e412c73e6c0e8b84e8",
          "body": "* feat: surface hook and predicate panics instead of swallowing them\n\nLifecycle hooks and the StopWhen predicate previously ran inside a\nrecover that printed the panic to stderr and discarded it, so callers\ncould not intercept it and observability handlers never saw it.\n\nAdd an OnPanic observability\n[…]\nl\") and reported to OnPanic instead of being\nre-raised as an uncaught panic, so a panic carrying sensitive data is not\nprinted to stderr as a crash dump. Threads o.OnPanic through the five\ncall sites.",
          "is_bot": false,
          "headline": "feat: surface hook and predicate panics instead of swallowing them (#85)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T01:18:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f8e46fe59897d0e4e53059426c29c9b4fdc00ad3",
          "body": "…#86)\n\nThe FPT Smart Cloud key for Qwen3.6-27B is rejected (401 Invalid API\nKey), so the review step failed on every run. Switch the reviewer model\nto google/gemini-3-flash-preview, reading GEMINI_API_KEY.",
          "is_bot": false,
          "headline": "ci: switch zenflow-review to Google Gemini (gemini-3-flash-preview) (…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-07T00:24:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c30bd4542c1dd6cdf34b8b2a9e8bb52804d5ef16",
          "body": "Delete the compiled example executables (agent-loop, chat, tools,\nstreaming) that were accidentally committed to the repo root, ignore\nthem in .gitignore, and add a pre-commit check that rejects any staged\nfile whose content is a compiled executable or shared library.\n\nCloses #81",
          "is_bot": false,
          "headline": "fix: remove committed binaries and block them in pre-commit (#84)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-06-06T22:52:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "336ba79ea944da2761e19c3cf267c0a455d50c91",
          "body": null,
          "is_bot": false,
          "headline": "feat(mcp): native OAuth 2.1 + PKCE for remote MCP servers (#80)",
          "author_name": "DevLumuz",
          "author_login": "DevLumuz",
          "committed_at": "2026-06-06T07:08:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01ed3e19f80d9ff5b7db831659619c1aacf71720",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.11",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-30T23:01:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3c1f3327c778052731adef8e8f13adac946fb030",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.11",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-30T22:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "537d60512b969c5907864a7e238b29c8f91f5a6a",
          "body": "* feat: add llama.cpp server provider\n\nAdd provider/llamacpp package for connecting to llama.cpp server\n(OpenAI-compatible API at http://localhost:8080).\n\n- Chat() and Embedding() constructors\n- Options: WithBaseURL, WithHeaders, WithHTTPClient\n- 12 unit tests, 100% coverage\n- Follows ollama/vllm convenience wrapper pattern\n\n* fix: validate URL scheme is http or https in WithBaseURL",
          "is_bot": false,
          "headline": "feat: add llama.cpp server provider (#77)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-30T22:51:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d3820e117af8fba4c253b2b62e059fdd3b0093f",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.10",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:55:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1979fdff8ca82eadee36990a780c7c7032a2a6da",
          "body": "…#74) (#76)\n\nPer MCP Streamable HTTP spec (2025-03-26), the GET-for-SSE channel is\nOPTIONAL; a server that does not offer it SHOULD return 405. Our\nHTTPTransport.Start treated any non-200 as fatal, so servers like Zoho\nMCP failed with \"SSE connection failed: HTTP 405\". Treat 405 and 404\nas \"POST-only\" and keep the transport usable; POST responses already\ndispatch inline JSON-RPC / SSE results.",
          "is_bot": false,
          "headline": "fix(mcp): HTTPTransport tolerates POST-only Streamable HTTP servers (…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:53:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "73abb9e287a839e2af1571abeffb6c147aa978de",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.9",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:18:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "523097c2f495df5187199a5815ca278c82536c11",
          "body": "The Responses API stream used bufio.Scanner with a 1MiB cap, so very\nlong output_text.delta or reasoning events still failed with\n\"bufio.Scanner: token too long\" after #73 (which only fixed\ninternal/sse). Switch streamResponses to sse.Scanner and add a\nNextLine method that returns raw event-typed SSE lines while keeping\nthe 16MiB MaxLineSize bound.",
          "is_bot": false,
          "headline": "fix(openai): handle Responses API SSE lines larger than 1MiB (#70) (#75)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-28T23:14:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b57bd142c85a25aac30600bbe34fb9738dbbda3",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.8",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-27T23:23:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d51745caa057e8f1ec5711c63f7b12c9deb9bcbd",
          "body": "* fix(sse): handle SSE lines larger than 1MiB\n\nSwitch the SSE scanner from bufio.Scanner (capped at 1MiB) to\nbufio.Reader.ReadString, which grows as needed. Long data lines (e.g.\nlarge tool-call argument deltas or reasoning blocks) no longer fail\nwith \"bufio.Scanner: token too long\". Also strip trai\n[…]\ncious or buggy upstream to force unbounded client allocation. Add\na 16 MiB hard limit (large enough for real-world tool-call argument\ndeltas and reasoning blocks) and surface oversize lines via Err().",
          "is_bot": false,
          "headline": "fix(sse): handle SSE lines larger than 1MiB (#70) (#73)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-27T23:08:08Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "331a3af59548d7fa7ee5d0c080274392a303e929",
          "body": "…k thinking-mode multi-turn round-trips (#72)",
          "is_bot": false,
          "headline": "openaicompat: echo reasoning_content on assistant messages so DeepSee…",
          "author_name": "tenjinfactory",
          "author_login": "tenjinfactory",
          "committed_at": "2026-05-27T22:03:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "88e9647d29e21d68865218e932acfb74e9c9a117",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.7",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-16T23:03:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fa1f4a0c9c9fa97ab1215da403088eff656efb3",
          "body": null,
          "is_bot": false,
          "headline": "chore: release v0.7.7",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-16T23:01:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a1a5b4c19f1221fdd418442ec8494eea2d09c16d",
          "body": "* fix(openai): rename max_tokens by model, not reasoning_effort\n\nReasoning models (o-series, gpt-5+, codex) reject the max_tokens\nparameter and require max_completion_tokens. The rename was gated on a\nreasoning_effort provider option being present, so a caller that set\nWithMaxOutputTokens without re\n[…]\nreview on #69 flagged isReasoningModel being duplicated in\ninternal/openaicompat and provider/openai. Export it as\nopenaicompat.IsReasoningModel and have provider/openai consume the\nsingle definition.",
          "is_bot": false,
          "headline": "fix(openai): rename max_tokens by model, not reasoning_effort (#69)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-16T23:00:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e7020860f6ea14626f0fe9c8fff622b8657fddbb",
          "body": "One-line note under \"Submit a PR\" so contributors know maintainers\ncan run the AI code review on demand, pointing at the workflow file\nfor details.",
          "is_bot": false,
          "headline": "docs(contributing): mention /zenflow-review trigger (#65)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-14T10:07:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e86c5a6b5818b21aab941f7febc9d720a7eb68a9",
          "body": "Without --sandbox, --yolo, or --allow, zenflow denies every tool call\non a non-interactive terminal. First smoke test (issue_comment run\n25853651887 on PR #65) failed because:\n\n- review-idioms and review-security could not call `read` (warning\n  only; their diff is also injected via contextFiles so \n[…]\ned and the \"Post review comment\" step exited 1\n\n--sandbox pre-allows the safe tool set (read, write, grep, glob) and\nexplicitly blocks bash, which matches what the three reviewer agents\nactually need.",
          "is_bot": false,
          "headline": "fix(zenflow-review): pass --sandbox to grant tool permissions (#66)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-14T09:59:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8666ce44f544bbf08f4a1eefd2692e906c2c9e18",
          "body": "Adds a two-reviewer (Go idiomatics + security) AI code review\nworkflow powered by zenflow v0.1.5 and FPT Smart Cloud's Qwen3.6-27B\n(JP region, 262K context).\n\nTrigger: a maintainer (OWNER / MEMBER / COLLABORATOR) posts a\n`/zenflow-review` comment on the PR. The action fetches the diff,\nruns two revi\n[…]\nrtifacts (diff.patch, events.ndjson, review.md)\n\nSetup: requires `FPT_API_KEY` org-level secret (FPT Smart Cloud JP\nmarketplace API key). Default GITHUB_TOKEN covers diff fetch and PR\ncomment posting.",
          "is_bot": false,
          "headline": "ci(zenflow-review): add comment-triggered AI PR review workflow (#64)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-14T09:48:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6f5f1daa5eaf6155d69968fa5029820bbbb6bc48",
          "body": null,
          "is_bot": false,
          "headline": "docs: point README Orchestration link to zenflow repo",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-11T10:18:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "220bb077b379e04dad4351ca354fc323a2c34a94",
          "body": "…ME header",
          "is_bot": false,
          "headline": "docs: promote zenflow to top-level Orchestration link in nav and READ…",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-11T10:17:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "926612fcb0a4c43114624357c358329a90d35bf5",
          "body": "Add zenflow to the GoAI homepage and README so readers building agents\nhave a natural next step beyond a single MaxSteps loop. Two touchpoints:\na one-line bullet in the features list and a Companion Projects section.\nREADME links target the zenflow repo; docs site links the zenflow site.",
          "is_bot": false,
          "headline": "docs: introduce zenflow as companion project on home and README",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-11T09:50:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "123bbffbdd0915ba5d451de0cc9f479762cc3138",
          "body": null,
          "is_bot": false,
          "headline": "chore: gitignore .zencode and testdata, drop tracked artifacts",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T10:47:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "479c787e0b74477dc5be012d390566b497566076",
          "body": "* chore: roadmap entry for v0.7.6\n\n* chore: update versions.json for v0.7.6",
          "is_bot": false,
          "headline": "chore: release v0.7.6 (#63)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T10:19:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b1fdf10c4fa561c54ae645e0320cf68cf29def2f",
          "body": "Mirrors the goai SDK link that zenflow's docsite already exposes.",
          "is_bot": false,
          "headline": "docs: add zenflow link to nav Links menu (#62)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T07:53:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5bb120c8ddee006bcd2a4ce09ba6612e5971394f",
          "body": "…alls (#61)\n\n* fix(anthropic,openai,bedrock,core): round-trip server-executed tool calls\n\nProvider-executed tools (Anthropic web_search/code_execution/web_fetch/mcp,\nOpenAI Responses web_search_call/file_search_call/code_interpreter_call/\nimage_generation_call/local_shell_call/mcp_call/computer_call\n[…]\nat:\n\n- Default base URL when WithBaseURL is omitted.\n- Cross-region inference profile region override.\n- base.RoundTrip error propagation.\n- Body sent without anthropic_beta when no betas are present.",
          "is_bot": false,
          "headline": "fix(anthropic,openai,bedrock,core): round-trip server-executed tool c…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-08T03:51:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3543cdf0d81bf067e4e578f57981542dc7bcce55",
          "body": "…#58)\n\nThe ChunkToolCallDelta TrySend cancel branch added in #57 lacked\ntest coverage. Add nested cancel tests that exercise the new return\npath in both adapters, and (for openai-responses) a test that lets\nthe delta succeed and cancels at the final ChunkToolCall TrySend.",
          "is_bot": false,
          "headline": "test(openai,cohere): cover cancel path on streaming tool-call delta (…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-07T10:17:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dfd32443e949d18e42feea017e1bcc501776cc8",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.5",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-07T10:10:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "99d8f3160b29275a5e81df9394e2ac73cc290fe1",
          "body": null,
          "is_bot": false,
          "headline": "chore: roadmap entry for v0.7.5",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-07T10:08:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9df2503ca913ba5c42ec9ecae2d14f578bf1ac1e",
          "body": "…ming (#57)\n\nThe openai-responses and cohere streaming adapters buffered tool-call\nargument fragments internally and only emitted ChunkToolCall once the\naccumulated buffer parsed as JSON (or at done/end). Consumers wanting\nprogressive rendering of large tool inputs (e.g. write/edit content)\nsaw a lo\n[…]\ning consumers are unaffected and new ones can render progress.\n\nAligns these two adapters with anthropic, bedrock-converse, and the\nshared openaicompat codec, which already forward deltas. Closes #56.",
          "is_bot": false,
          "headline": "fix(openai,cohere): forward ChunkToolCallDelta during tool-call strea…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-07T10:01:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d352b962310b05cf1f9f9ab0428b3921668ed3b3",
          "body": "Consumers importing observability/langfuse and observability/otel as\nseparate Go modules need per-submodule tags (<path>/vX.Y.Z) for go get\nto resolve. Tag every sub-module with its own go.mod at the root tag's\ncommit, excluding internal-only paths (examples/*, bench/*).",
          "is_bot": false,
          "headline": "ci(release): tag Go sub-modules at root tag commit (#55)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-03T23:40:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64a791349dd797956e2093239e3323de16784461",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.4",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-05-03T11:01:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "72a32a9bc656cb4924b8e54ba63fbd7bd2b8643e",
          "body": null,
          "is_bot": false,
          "headline": "chore: roadmap entry for v0.7.4",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-05-03T10:59:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc0938adbfb723d44bdc8e8ecb014242135749e0",
          "body": "* fix(azure): drop api-version query on v1 GA path\n\nAzure's v1 GA spec removed the dated `api-version` parameter; sending\nit on `/openai/v1{path}` is rejected by spec-strict resources with\n\"API version not supported\" (observed on gpt-5.5). The legacy\ndeployment-based path still requires it, so api-v\n[…]\n legacy\n  deployment-based path\n- URL Format section spells out the v1 GA contract, the api-version\n  rejection from spec-strict resources, and when to opt back into the\n  legacy deployment-based path",
          "is_bot": false,
          "headline": "fix(azure): drop api-version query on v1 GA path (#54)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-05-03T10:59:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e308dc447951187ab631071818ddaec2cc8f8dc5",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.3",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-27T07:00:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb7cf6772ef5655dc9fa7a41c6a4e630e0727268",
          "body": null,
          "is_bot": false,
          "headline": "chore: roadmap entry for v0.7.3",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-27T07:00:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "512eb7c69fb0da06473de55903181a01b8cc585f",
          "body": "* feat: surface reasoning text on TextResult and StepResult\n\nAdds a Reasoning field to provider.GenerateResult, goai.StepResult,\nand goai.TextResult so callers can render extended-thinking output\nwithout digging into ProviderMetadata. Wired through Bedrock's\nnon-streaming Converse parser and through\n[…]\nult_ReasoningSummary to lock the\nnon-streaming path that concatenates reasoning.summary entries into\nGenerateResult.Reasoning. Closes the patch-coverage gap reported by\ncodecov on the previous commit.",
          "is_bot": false,
          "headline": "feat: surface reasoning text on TextResult and StepResult (#53)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-27T07:00:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b2ae1739b938c8ae517cfd28ee0e7436b281be36",
          "body": "- update 24+ to 25+ across README, compare, architecture, getting-started, providers index, vitepress meta\n- dedupe NVIDIA NIM row in README; mark nvidia E2E as Full; add NVIDIA to providers-and-models list\n- types.md: add StopCause, ToolResult; add ToolResults to StepResult; add StoppedBy to StreamChunk; reorder TextResult/ObjectResult/Embed fields to match code\n- nvidia.md: note 100-value embedding batch limit",
          "is_bot": false,
          "headline": "docs: bump provider count to 25+ and refresh type/nvidia docs (#52)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-24T04:36:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3bdb3c67fe05181f03a115c9188aad8c9f892c7",
          "body": null,
          "is_bot": false,
          "headline": "chore: remove accidental binary file nvidia.test",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:36:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1cca8932ecd93ff278b28c232da7486355f88a6c",
          "body": "docs: update homepage for v0.7.2",
          "is_bot": false,
          "headline": "Merge pull request #51 from zendev-sh/docs/homepage-v0.7.2",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:35:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ab969885ddf3e5f58eab9fa722fd6a96101af05d",
          "body": null,
          "is_bot": false,
          "headline": "docs: update homepage for v0.7.2 and add NVIDIA logo",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:34:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d93bad98e224e9268cc5f14a3a8adc358f61927",
          "body": null,
          "is_bot": true,
          "headline": "chore: update versions.json for v0.7.2",
          "author_name": "github-actions[bot]",
          "author_login": "github-actions[bot]",
          "committed_at": "2026-04-23T03:20:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5fba307c5cb2ce32c4d2db57c3e1718b4c311fe",
          "body": "feat: add NVIDIA NIM provider (v0.7.2)",
          "is_bot": false,
          "headline": "Merge pull request #50 from zendev-sh/feat/nvidia-provider",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:15:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "77b8d521345da4b8b72136735201fae471f06d59",
          "body": null,
          "is_bot": false,
          "headline": "merge: resolve conflicts with main",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:09:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ac54ca942bf28c79285628a1312a7d86b82ce2d8",
          "body": "…thropic, add nvidia tests",
          "is_bot": false,
          "headline": "fix: test failures - env vars in Google tests, ProviderMetadata in An…",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T03:08:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "14210a1c9355177b84000be1e4e67e2ad24eeae9",
          "body": null,
          "is_bot": false,
          "headline": "feat: add NVIDIA NIM provider (v0.7.2)",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T01:29:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "62348ff6f40b3fd6f8e55ae30675783ff43b7387",
          "body": null,
          "is_bot": false,
          "headline": "fix: test failures",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-23T01:25:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "32a80270afbc59d216f671043a85a028979db337",
          "body": "Adds a concepts page covering the full tool-loop lifecycle: StepKind\nprogression (Starting → LLMInFlight → StepFinished → ToolExecuting →\nIdle, plus terminal Done/Cancelled/Error), Observe polling, safe sync\npoints for StreamText vs GenerateText, the SetTerminal CAS protocol,\nand WithStopWhen semant\n[…]\nafety, aliasing\ncontract, stream StoppedBy).\n\nAdds WithStopWhen and WithStateRef entries to the options reference\nwith pointers into the concepts page. Adds the new page to the\nsidebar under Concepts.",
          "is_bot": false,
          "headline": "docs: document AgentState, WithStateRef, WithStopWhen (#49)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T23:37:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d8d7f70f9358d549a51b07d6fa7b8e64306cf91e",
          "body": "* feat: add terminal StepKinds and SetTerminal CAS on AgentState\n\nIntroduce StepDone/StepCancelled/StepError as sticky terminal states\ndistinct from StepIdle. SetTerminal(kind) uses CAS so the first caller\nwins and the step counter is preserved across the transition. Intended\nfor consumers (e.g. zen\n[…]\ns IsTerminal() helper and covers: per-kind transition, stickiness,\nnil receiver no-op, panic on non-terminal arg, and concurrent single-\nwinner race.\n\n* test: cover String() for new terminal StepKinds",
          "is_bot": false,
          "headline": "feat: add terminal StepKinds and SetTerminal CAS on AgentState (#48)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T23:33:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9e56d09f06f04df31612e453899f362982bf0f5d",
          "body": "* feat: add AgentState, WithStopWhen, ToolResult, and StopCause\n\n- AgentState + WithStateRef: race-free, atomically-packed (kind, step)\n  observable into the tool loop lifecycle, with a monotonic step counter\n  preserved across error paths.\n- WithStopWhen: Vercel-parity StopCondition evaluated after\n[…]\nAllBranches mirrors the StateRef test\n  to cover the StreamObject and default switch arms.\n- ToolResult.UnmarshalJSON gains a type-mismatch case that exercises\n  the inner json.Unmarshal error return.",
          "is_bot": false,
          "headline": "feat: add AgentState, WithStopWhen, ToolResult, StopCause (#47)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T10:03:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d89a1e93f1e004849072b3d91e7f98c155bc9c9a",
          "body": null,
          "is_bot": false,
          "headline": "chore: update versions.json and roadmap for v0.7.1",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T01:34:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a846a8ee13472d2b9f843c6a9f638a06912f40c8",
          "body": "… (#46)\n\n* refactor(openaicompat): extract NewChatModel / NewEmbeddingModel factories\n\nAbsorbs the common boilerplate (options wiring, HTTP dispatch, token\nresolution, env-var fallback plumbing) from 14 OpenAI-compat provider\npackages into shared factories in internal/openaicompat.\n\nPer-provider fil\n[…]\nactory has direct tests in internal/openaicompat/factory_test.go.\nAll 14 refactored providers at 100% statement coverage; factory at 99%.\n\n* test(openaicompat): cover io.ReadAll error paths in factory",
          "is_bot": false,
          "headline": "refactor(openaicompat): extract shared factories for chat + embedding…",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T01:34:32Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9aa01ed8fd07095c0ba139d95d69ff53068d1129",
          "body": null,
          "is_bot": false,
          "headline": "fix(homepage): nested anchor in v0.7.0 release card breaking layout",
          "author_name": "vietanh85",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T00:23:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a5687653b17bef8ce51ab8538a8c078edc6ec3a",
          "body": "* feat: add Cloudflare Workers AI and FPT Smart Cloud providers\n\nBoth providers use the OpenAI-compatible Chat Completions and Embeddings\nendpoints with full unit test coverage (92% and 94%) and E2E verification\nagainst real APIs.\n\n- provider/cloudflare: chat + embeddings, builds URL from CLOUDFLARE\n[…]\n\nAdds tests for uncovered branches flagged by codecov/patch: embedding WithHeaders, connection errors, invalid JSON parsing, stream HTTP error, stream PromptCaching branch, and embeddingModel.ModelID.",
          "is_bot": false,
          "headline": "feat: add Cloudflare Workers AI and FPT Smart Cloud providers (#45)",
          "author_name": "anh",
          "author_login": "vietanh85",
          "committed_at": "2026-04-19T00:13:39Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 46,
      "commits_last_year": 224,
      "latest_release_at": "2026-07-28T21:00:18Z",
      "latest_release_tag": "v0.9.2",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 0,
      "mean_days_between_releases": 5.8
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 75,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": true
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/zendev-sh/goai",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/zendev-sh/goai",
          "is_deprecated": false,
          "latest_version": "v0.9.2",
          "repository_url": "https://github.com/zendev-sh/goai",
          "versions_count": 46,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-28T20:59:57Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 24,
      "stars": 171,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-19",
            "count": 2
          },
          {
            "date": "2026-03-26",
            "count": 1
          },
          {
            "date": "2026-04-01",
            "count": 1
          },
          {
            "date": "2026-04-05",
            "count": 1
          },
          {
            "date": "2026-04-08",
            "count": 1
          },
          {
            "date": "2026-05-22",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-27",
            "count": 2
          },
          {
            "date": "2026-05-29",
            "count": 1
          },
          {
            "date": "2026-06-05",
            "count": 1
          },
          {
            "date": "2026-06-07",
            "count": 1
          },
          {
            "date": "2026-06-08",
            "count": 1
          },
          {
            "date": "2026-06-11",
            "count": 1
          },
          {
            "date": "2026-06-13",
            "count": 1
          },
          {
            "date": "2026-06-15",
            "count": 1
          },
          {
            "date": "2026-06-18",
            "count": 1
          },
          {
            "date": "2026-06-19",
            "count": 1
          },
          {
            "date": "2026-06-24",
            "count": 1
          },
          {
            "date": "2026-07-10",
            "count": 1
          },
          {
            "date": "2026-07-16",
            "count": 1
          },
          {
            "date": "2026-07-19",
            "count": 1
          },
          {
            "date": "2026-07-25",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 24,
        "total_forks": 24
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile",
        "bench/Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "bench/go/go.mod",
        "examples/langfuse/go.mod",
        "examples/otel/go.mod",
        "go.mod",
        "observability/langfuse/go.mod",
        "observability/otel/go.mod"
      ],
      "largest_source_bytes": 212337,
      "source_files_sampled": 210,
      "oversized_source_files": 13,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 4968
    },
    "dependencies": {
      "manifests": [
        "go.mod",
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go",
        "npm"
      ],
      "dependencies": [
        {
          "name": "go.uber.org/goleak",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.0"
        },
        {
          "name": "golang.org/x/oauth2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.36.0"
        },
        {
          "name": "lucide-vue-next",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.577.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": 97,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 21,
        "closed_unmerged_prs": 12
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "vietanh85",
          "commits": 170,
          "avatar_url": "https://avatars.githubusercontent.com/u/547198?v=4"
        },
        {
          "type": "User",
          "login": "DevLumuz",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/124409412?v=4"
        },
        {
          "type": "User",
          "login": "nehmeroumani",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/10393081?v=4"
        },
        {
          "type": "User",
          "login": "oscarbc96",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/4248262?v=4"
        },
        {
          "type": "User",
          "login": "bclermont",
          "commits": 2,
          "avatar_url": "https://avatars.githubusercontent.com/u/474302?v=4"
        },
        {
          "type": "User",
          "login": "claudiunicolaa",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/15197275?v=4"
        },
        {
          "type": "User",
          "login": "kadirgun",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/1864516?v=4"
        },
        {
          "type": "User",
          "login": "slegarraga",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/64795732?v=4"
        },
        {
          "type": "User",
          "login": "Thibaultjaigu",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/84420566?v=4"
        },
        {
          "type": "User",
          "login": "tenjinfactory",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/250921212?v=4"
        }
      ],
      "contributors_sampled": 10,
      "top_contributor_share": 0.89
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "docs.yml",
        "release.yml",
        "zenflow-review.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum",
        "package-lock.json"
      ],
      "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": 10,
            "reason": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 4,
            "reason": "Found 12/30 approved changesets -- score normalized to 4",
            "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": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "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": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "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": null,
            "reason": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 1,
            "reason": "9 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "9ee1031a674c6d636bfe941212f76941c473a7d7",
        "ran_at": "2026-07-29T00:40:43Z",
        "aggregate_score": 3.7,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-28T21:02:34Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-28T20:59:58Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/zendev-sh/goai",
    "host": "github.com",
    "name": "goai",
    "owner": "zendev-sh"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": "The weighted overall 67 is calibrated to 78 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 67,
            "calibrated": 78,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 78,
      "inputs": {
        "security": 37,
        "vitality": 86,
        "community": 62,
        "governance": 59,
        "calibration": "2026-08-02",
        "engineering": 81,
        "ai_readiness": 79,
        "weighted_overall_raw": 67
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 224,
              "human_commit_share": 0.84,
              "days_since_last_push": 0,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "224 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 224
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "exceptional",
            "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": 100,
            "inputs": {
              "releases_count": 46,
              "latest_release_tag": "v0.9.2",
              "releases_from_tags": false,
              "days_since_latest_release": 0,
              "mean_days_between_releases": 5.8
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "46 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 46
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 0 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~5.8 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 5.8
                    }
                  }
                ],
                "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": "exceptional",
            "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": "moderate",
        "name": "Community & Adoption",
        "value": 62,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "weak",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 48,
            "inputs": {
              "forks": 24,
              "stars": 171,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "171 stars",
                "points": 36.2,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 171
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "24 forks",
                "points": 11.3,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 24
                    }
                  }
                ],
                "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": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 77,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": null,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "has_pull_request_template": true
            },
            "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": 18,
                "status": "met",
                "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": 6.3,
                "status": "met",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 59,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "at_risk",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 10,
              "top_contributor_share": 0.89
            },
            "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 89% of commits",
                "points": 2.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 89
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "10 contributors",
                "points": 13.5,
                "status": "met",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "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": "excellent",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 86,
            "inputs": {
              "merged_prs": 97,
              "open_issues": 0,
              "closed_issues": 21,
              "prs_merged_7d": null,
              "prs_decided_7d": null,
              "prs_merged_30d": null,
              "prs_decided_30d": null,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 12,
              "first_time_authors_30d": null,
              "first_time_prs_merged_30d": null,
              "first_time_prs_decided_30d": null
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 42,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "97/109 decided PRs merged",
                "points": 26.7,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 97,
                      "decided": 109
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 12/30 approved changesets -- score normalized to 4",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "weak",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 41,
            "inputs": {
              "followers": 5,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "zendev-sh",
              "public_repos": 3,
              "account_age_days": 165
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "5 followers of zendev-sh",
                "points": 5.6,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 5,
                      "login": "zendev-sh"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "3 public repos, account ~0 yr old",
                "points": 5.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 3
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/zendev-sh/goai"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 0
            },
            "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 0 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 0
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "46 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 46
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 81,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "exceptional",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "ai",
                "ai-agents",
                "ai-tools",
                "llm",
                "sdk-go",
                "ai-sdk",
                "anthropic",
                "azure-op",
                "bedro",
                "cerebra",
                "gemini",
                "minimax",
                "openai",
                "openrouter",
                "vercel",
                "vertex-ai",
                "go-ai-sdk",
                "goai",
                "zenflow"
              ],
              "has_wiki": true,
              "homepage": "https://goai.sh/",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://goai.sh/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "19 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 19
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "weak",
        "name": "Security",
        "value": 37,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, SAST, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "sast",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 37,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 12,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 6,
              "scorecard_aggregate": 3.7
            },
            "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": "22 out of 22 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 12/30 approved changesets -- score normalized to 4",
                "points": 3,
                "status": "partial",
                "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": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "9 existing vulnerabilities detected",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "exceptional",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "commit_weight_rule": {
                "min_commits": 50,
                "min_commit_share": 0.1
              },
              "review_only_matches": 0,
              "below_threshold_exposures": [],
              "assessed_self_published_locations": 3
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 79,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "exceptional",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 4968
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "84 of 84 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 84,
                      "sampled": 84
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 70,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum",
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile",
                "bench/Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.01,
              "toolchain_manifests": [
                "bench/go/go.mod",
                "examples/langfuse/go.mod",
                "examples/otel/go.mod",
                "go.mod",
                "observability/langfuse/go.mod",
                "observability/otel/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile, bench/Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile, bench/Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "1 of the last 100 commits agent-authored or agent-credited",
                "points": 2,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 1,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "internal error: internal error: invalid GitHub workflow:\n:67:12: could not parse as YAML: mapping values are not allowed in this context [syntax-check]",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "exceptional",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 97,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 212337,
              "source_files_sampled": 210,
              "oversized_source_files": 13
            },
            "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": "13/210 source files over 60KB",
                "points": 51.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 210,
                      "oversized": 13
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "weak",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library"
      ],
      "labels": [
        "library"
      ],
      "scores": {
        "library": 5
      },
      "primary": "library",
      "evidence": [
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:go",
          "weight": 3
        },
        {
          "tier": "description",
          "label": "library",
          "source": "description:library",
          "weight": 2
        }
      ],
      "artifacts": [],
      "confidence": "low",
      "host_extension": false,
      "runs_as_process": false,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-29T00:41:00.380446Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/z/zendev-sh/goai.svg",
  "full_name": "zendev-sh/goai",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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