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

livetemplate / lvt

LiveTemplate CLI - Code generator and development server for rapid application development

Go · Go TemplateMIT★ 0 зірок⑂ 0 форківз лист. 2025 р.Переглянути на GitHub ↗

livetemplate/lvt має індекс здоров’я 58 зі 100, що відповідає смузі «Помірний». Найвищий показник — Vitality (86/100), найнижчий — Security (31/100). Останнє оновлення було 4 дні тому. Більшість нещодавньої роботи виконує один учасник.

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

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

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

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

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

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

Власність

livetemplateОрганізація
2 підписники9 публічних репозиторіївз жовт. 2025 р.

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

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

РеєстрПакетВерсіяЗавантажень / місВерсіїОстання публікація
Gogithub.com/livetemplate/lvtv0.2.0-95 днів тому
Gogithub.com/livetemplate/lvt/componentsv0.2.0-95 днів тому

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

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

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

86Відмінний · 22% загального індексу
Як обчислюється оцінка
36/36Свіжість push — останній push 4 дн. тому
20.1/36Ритм комітів — 29/52 тижнів із комітами
18/18Обсяг комітів — 182 комітів за останній рік
10/10OpenSSF Scorecard: Maintained — 26 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Використані вхідні дані
commits_last_year182
human_commit_share1
days_since_last_push4
active_weeks_last_year29
Як обчислюється оцінка
27/27Випускає релізи — опубліковано 9 релізів
36/36Свіжість релізів — останній реліз 5 дн. тому
27/27Ритм релізів — реліз кожні ~13,3 дн.
0/10OpenSSF Scorecard: Signed-Releases — Project has not signed or included provenance with any releases.
Використані вхідні дані
releases_count9
latest_release_tagv0.2.0
releases_from_tagsні
days_since_latest_release5
mean_days_between_releases13,3

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

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

33У зоні ризику · 18% загального індексу
Як обчислюється оцінка
0/60Зірки — 0 зірок
0/25Форки — 0 форків
0/15Спостерігачі — 0 спостерігачів
Використані вхідні дані
forks0
stars0
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
0/6.3Шаблон PR
Використані вхідні дані
has_readmeтак
has_licenseтак
has_contributingтак
has_issue_templateні
has_code_of_conductні
has_pull_request_templateні

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

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

50Помірний · 24% загального індексу
Як обчислюється оцінка
9/54Бас-фактор — на 1 контриб’ютор(ів) припадає половина всіх комітів
0/22.5Розподіл комітів — головний контриб’ютор — автор 100% комітів
1.4/13.5Широта контриб’юторів — 1 контриб’юторів
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Використані вхідні дані
bus_factor1
contributors_sampled1
top_contributor_share1
Як обчислюється оцінка
28.1/46.8Вирішення issue — закрито 60% issue
36.9/38.3Прийняття PR — злито 109/113 вирішених PR
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Використані вхідні дані
merged_prs109
open_issues90
closed_issues136
issue_closed_ratio0,602
closed_unmerged_prs4

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

42У зоні ризику
Як обчислюється оцінка
30/30Підтримка власника — у власності організації
0/20Верифікований домен
3.4/25Охоплення власника — 2 підписників у livetemplate
8.8/25Послужний список — 9 публічних репозиторіїв, вік облікового запису ~0 р.
Використані вхідні дані
followers2
owner_typeOrganization
is_verified
owner_loginlivetemplate
public_repos9
account_age_days279

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

100Відмінний
Як обчислюється оцінка
25/25Опубліковано й доступно — 2 пакет(ів) у go
35/35Свіжість публікацій — остання публікація 5 дн. тому
20/20Історія версій — 9 опублікованих версій
20/20Не застарілий — активний, не deprecated і не yanked
Використані вхідні дані
packagesgithub.com/livetemplate/lvt, github.com/livetemplate/lvt/components
ecosystemsgo
any_deprecatedні
min_days_since_publish5

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

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

80Добрий · 20% загального індексу
Як обчислюється оцінка
24/24Процеси CI — 6 процес(ів) CI
24/24Наявні тести
16/16Конфігурація лінтера — .golangci.yml
0/9.6Pre-commit-хуки
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 21 out of 21 merged PRs checked by a CI test -- score normalized to 10
Використані вхідні дані
has_ciтак
has_testsтак
has_editorconfigні
has_linter_configтак
has_precommit_configні
Як обчислюється оцінка
30/30README
25/25Каталог документації
0/15Сайт документації / домашня сторінка
10/10Опис репозиторію
0/10Теми
10/10Wiki
Використані вхідні дані
topics
has_wikiтак
homepage
has_readmeтак
has_docs_dirтак
has_descriptionтак

Безпека

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

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

Стан безпеки

31У зоні ризику
Як обчислюється оцінка
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 — 21 out of 21 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
0/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Ліцензія — license file detected
7.5/7.5Maintained — 26 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — немає даних
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — Project has not signed or included provenance with any releases.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 34 existing vulnerabilities detected
Використані вхідні дані
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate3,1
Виключено з оцінювання (немає даних або не застосовно): packaging. Залишкові ваги перенормовано.

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

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

80Добрий · 0% загального індексу
Як обчислюється оцінка
45/45Інструкції для агентів — .aider/.aider.conf.yml, .cursor/rules/lvt.md, .github/copilot-instructions.md
0/15Машиночитана документація (llms.txt)
40/40Читабельна історія комітів — намір зазначено у 100 з 100 людських комітів (структурований заголовок або пояснювальний текст)
Використані вхідні дані
has_llms_txtні
legible_history_share1
agent_instruction_files.aider/.aider.conf.yml, .cursor/rules/lvt.md, .github/copilot-instructions.md
agent_instruction_max_bytes8 194
Як обчислюється оцінка
18/18Розгортання однією командою — Makefile
22/22Автоматизовані тести
11/11Конфігурація лінтера / форматера — .golangci.yml
11/11Статична перевірка типів — Go (статично типізована)
10/10Відтворюване середовище — Dockerfile, lockfile
10/10Підтверджена практика роботи з агентами — 83 з останніх 100 комітів створено агентом або з його зазначенням
0/8Автоматизоване супроводження — автоматичних оновлень залежностей не виявлено
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Використані вхідні дані
has_nixні
has_testsтак
lockfilesgo.sum
has_dockerfileтак
typed_languageтак
bootstrap_filesMakefile
has_devcontainerні
has_linter_configтак
typecheck_configs
agent_commit_share0,83
toolchain_manifestscomponents/go.mod, go.mod
dependency_bot_commit_share0
Як обчислюється оцінка
45/45Типізований код — Go (статично типізована)
54.9/55Керовані розміри файлів — 1/390 файлів вихідного коду понад 60 КБ
Використані вхідні дані
primary_languageGo
largest_source_bytes91 935
source_files_sampled390
oversized_source_files1
Як обчислюється оцінка
0/40Схема API (OpenAPI/GraphQL/proto)
0/20Сервер MCP
40/40Придатні до запуску приклади — examples
Використані вхідні дані
example_dirsexamples
has_mcp_signalні
api_schema_files

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

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

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

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

Докладніше

OpenSSF Scorecard 3.1 / 10
3.1сукупно

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests21 out of 21 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained26 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
н/дPackagingpackaging workflow not detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
0Signed-ReleasesProject has not signed or included provenance with any releases.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities34 existing vulnerabilities detected
Прямі залежності 26
РеєстрПакетОбмеження версіїМаніфест
Gogithub.com/livetemplate/livetemplatev0.9.0components/go.mod
Gogithub.com/livetemplate/livetemplatev0.19.0go.mod
Gogithub.com/aws/aws-sdk-go-v2v1.41.1go.mod
Gogithub.com/aws/aws-sdk-go-v2/configv1.32.7go.mod
Gogithub.com/aws/aws-sdk-go-v2/credentialsv1.19.7go.mod
Gogithub.com/aws/aws-sdk-go-v2/service/s3v1.95.1go.mod
Gogithub.com/brianvoe/gofakeit/v7v7.8.2go.mod
Gogithub.com/charmbracelet/bubblesv0.21.0go.mod
Gogithub.com/charmbracelet/bubbleteav1.3.10go.mod
Gogithub.com/charmbracelet/lipglossv1.1.0go.mod
Gogithub.com/chromedp/cdprotov0.0.0-20250803210736-d308e07a266dgo.mod
Gogithub.com/chromedp/chromedpv0.14.2go.mod
Gogithub.com/disintegration/imagingv1.6.2go.mod
Gogithub.com/gorilla/websocketv1.5.3go.mod
Gogithub.com/livetemplate/lvt/componentsv0.0.0-00010101000000-000000000000go.mod
Gogithub.com/mattn/go-sqlite3v1.14.32go.mod
Gogithub.com/pressly/goose/v3v3.26.0go.mod
Gogithub.com/stretchr/testifyv1.11.0go.mod
Gogithub.com/wneessen/go-mailv0.7.2go.mod
Gogolang.org/x/cryptov0.47.0go.mod
Gogolang.org/x/modv0.33.0go.mod
Gogolang.org/x/netv0.49.0go.mod
Gogolang.org/x/textv0.35.0go.mod
Gogolang.org/x/timev0.14.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.mod
Gomodernc.org/sqlitev1.43.0go.mod
Усі залежності не зібрано

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

Звіт у форматі JSON машиночитний
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 2660,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 2500469,
        "Shell": 47620,
        "Makefile": 2729,
        "Go Template": 644719
      },
      "pushed_at": "2026-07-19T05:44:48Z",
      "created_at": "2025-11-02T23:27:32Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-19T05:44:54Z",
      "description": "LiveTemplate CLI - Code generator and development server for rapid application development",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "Go Template"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "livetemplate",
      "company": null,
      "location": null,
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/238750877?v=4",
      "created_at": "2025-10-17T19:14:08Z",
      "is_verified": null,
      "public_repos": 9,
      "account_age_days": 279
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-07-18T10:18:04Z"
        },
        {
          "tag": "v0.1.8",
          "kind": "patch",
          "published_at": "2026-05-21T21:27:09Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2026-05-20T22:15:24Z"
        },
        {
          "tag": "v0.1.6",
          "kind": "patch",
          "published_at": "2026-05-02T09:24:36Z"
        },
        {
          "tag": "v0.1.5",
          "kind": "patch",
          "published_at": "2026-04-27T21:51:00Z"
        },
        {
          "tag": "v0.1.4",
          "kind": "patch",
          "published_at": "2026-04-26T14:54:44Z"
        },
        {
          "tag": "v0.1.3",
          "kind": "patch",
          "published_at": "2026-04-10T12:40:39Z"
        },
        {
          "tag": "v0.1.2",
          "kind": "patch",
          "published_at": "2026-04-05T15:43:09Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-04-02T16:24:55Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "beb560884c92dd9fdc796cb633095b45be6d67d5",
          "body": "Same gap as livetemplate#500, fixed there in livetemplate#501.\n\nIf a release got as far as commit_and_tag and then failed to publish — a push\nerror, a goreleaser failure — the tree held a release commit and tags the remote\nhad never seen, and nothing said so. The next run read the already-bumped\nVER\n[…]\n, partial,\nnone), plus end-to-end: following the all-missing output verbatim publishes the\nrelease and clears the refusal.\n\nFollow-up tracked in #341 (extract the triplicated nested-module discovery).",
          "is_bot": false,
          "headline": "fix(release): refuse to bump on top of an unpublished release (#340)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-07-19T05:44:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dca2768496f174805087e21a2f9057e7ac83d0cb",
          "body": "…mped tree (#339)\n\nSame ordering bug as livetemplate#499, found there and confirmed here.\n\nThe order was update_versions -> generate_changelog -> build_and_test, so a test\nfailure aborted with VERSION and CHANGELOG.md already rewritten. main() refuses\nto run on a dirty tree, so the retry was blocked\n[…]\nover blocks the retry.\n\nVerified in throwaway clones, both branches of the condition: with CHANGELOG.md\nuntracked the abort leaves zero dirty files; with it tracked it is restored\nrather than deleted.",
          "is_bot": false,
          "headline": "fix(release): survive an aborted release instead of leaving a half-bu…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-07-18T15:09:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d0d669c66279d64044b8466f594c541a3f67fdcd",
          "body": "…n v0.2.0\n\nrelease.sh's fallback generator emits a raw commit list; add a short\nuser-facing note for what the core adoption means for scaffolded apps.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(changelog): note the v0.19.0 wire-format and recursion changes i…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-07-18T10:19:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2a88feb18e38e6e1b76b12952a1dc68cce094c63",
          "body": "Release LVT CLI v0.2.0\n\n🤖 Generated with automated release script",
          "is_bot": false,
          "headline": "chore(release): v0.2.0",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-07-18T10:16:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bc1659c0d4174652d51bb7e5df1b2ff0368d73fb",
          "body": "…ns and e2e (#337)\n\nBumps the pinned core from v0.11.1 to v0.19.0 and lands the two C8 branches that were blocked behind the core release.\n\nlivetemplate v0.19.0 changes the range wire format: the differential range path now emits granular ops (r/u/i/o/p) where it previously re-sent the whole range p\n[…]\nild clean across\nthe 7-minor jump, unit tests pass, and the full browser e2e suite passes (377s)\nincluding all 7 todo goldens and TestRecursiveTemplate_E2E.\n\nFollow-up harness cleanup tracked in #338.",
          "is_bot": false,
          "headline": "chore(deps): adopt livetemplate v0.19.0 + land release-gated C8 golde…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-07-18T09:58:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f3a6dff77360c1ea39778f2bcc47b9ae7f4ee370",
          "body": "…oses #335) (#336)\n\n* test(e2e): migrate older WS-ready guards to WaitForWebSocketReady\n\nCloses #335.\n\nThe `typeof window.liveTemplateClient !== 'undefined'` check fires after\nthe client script tag evaluates but BEFORE the WebSocket handshake\ncompletes, allowing a fast click in the test sequence to \n[…]\nonly after the client has cleared the attribute).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(e2e): migrate older WS-ready guards to WaitForWebSocketReady (cl…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-23T21:24:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2a7b37a0ffd31c97b0ca699dd0d797db42dcf328",
          "body": "… (#334)\n\n* test(e2e): chromedp regression test for livetemplate#414 + bump to v0.11.1\n\nAdds TestIssue414_WrapperInjection_HeadWithBodyDecoy: a full-HTML\ntemplate whose <head> contains a CSS comment with a literal \"<body>\"\nstring — the canonical pattern that previously caused the wrapper\n[data-lvt-i\n[…]\n instead of getting a confusingly-old\n  snapshot.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(e2e): chromedp regression for livetemplate#414 + bump to v0.11.1…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-23T12:45:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8cfe1368f1237c6a328e214526d300f57e4d5f69",
          "body": "…publish (#333)\n\n* docs(roadmap): clarify lvt transport broadcast vs livetemplate topic publish\n\nSection 4.3 (WebSocket Channels / PubSub) mixed two senses of \"broadcast\"\nthat became ambiguous after livetemplate v0.10.0 introduced topic-scoped\nctx.Publish: lvt's WebSocketManager has a literal transp\n[…]\nalign transport-level broadcast phrasing in Current State line\n\nhttps://claude.ai/code/session_01QyZJquR75XBH1URLP2yNyU\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(roadmap): clarify lvt transport broadcast vs livetemplate topic …",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-22T18:17:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dc7d1a4ddc7fd3d3ac9f3a1c51c9ea74c4f5ccf3",
          "body": "Release LVT CLI v0.1.8\n\n🤖 Generated with automated release script",
          "is_bot": false,
          "headline": "chore(release): v0.1.8",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-21T21:26:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e3b78fa18373d97401e6fc6b9f51031550ec1633",
          "body": "…ion (v0.1.8-prep) (#332)\n\n* feat: Phase 6 — lvt#331 fix + GOWORK=off + PollUntil helper + V14 key-assertion\n\nPhase 6 of the broadcast-redesign wave (livetemplate#415) — lvt side.\n\nlvt#331 — generateClientID control-char bug fixed (internal/serve/websocket.go):\n- string(rune(clientCounter)) → strcon\n[…]\nn 2.2s against the released livetemplate v0.10.1.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Phase 6: lvt#331 fix + GOWORK=off + PollUntil helper + V14 key-assert…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-21T21:23:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e132b0dbd81c773d3fedf7980b306cf76f50b2f6",
          "body": "Release LVT CLI v0.1.7\n\n🤖 Generated with automated release script",
          "is_bot": false,
          "headline": "chore(release): v0.1.7",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-20T22:13:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92b0848254ca7b498ef986d40f9ccaeda7f78327",
          "body": "…t→ReloadClients; integrate V14 e2e (#330)\n\n* feat(broadcast)!: Phase 5 — pin livetemplate v0.10.0; rename Broadcast→ReloadClients; integrate V14 e2e\n\nPhase 5 of the broadcast-action-redesign proposal (livetemplate#415) on the\nlvt side. Three coordinated changes:\n\n1. **go.mod pin v0.9.1 → v0.10.0**.\n[…]\n    for Phase 6 in the test comment\n  - Pre-existing generateClientID() rune(counter) producing control chars —\n    pre-existing on lvt main, out of Phase 5 scope; will track as a follow-up\n    issue.",
          "is_bot": false,
          "headline": "feat(broadcast)!: Phase 5 — pin livetemplate v0.10.0; rename Broadcas…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-20T22:12:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3bd71f24398119de9ab383ceec2fd3a2fcf78927",
          "body": "…329)\n\nPR #328 restored the lvt pre-commit lint gate (golangci-lint v2 flag rename), which immediately surfaced 84 pre-existing findings that had been silently bypassed since the v1→v2 transition. This PR clears the backlog so subsequent commits land on a real, enforced gate. Setup for the broadcast\n[…]\n5 broadcast-action-redesign work can now land on a clean baseline.\n\n🤖 Generated with [Claude Code](https://claude.com/claude-code)\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: clear pre-existing lint baseline + add .golangci.yml config (#…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-20T21:14:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d2ffa337f3e2f1f963fed9b53ae2497b4e27263c",
          "body": "…#328)\n\n* chore(scripts): fix pre-commit lint invocation for golangci-lint v2\n\nThe pre-commit hook's golangci-lint invocation used `--disable-all`,\nwhich was renamed in golangci-lint v2 to `--default=none`. With v2\ninstalled, the flag-parse fails and the lint step silently aborts with\n`Error: unknow\n[…]\nodes.\n\nBoth are comment-only; no behavior change.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(scripts): fix pre-commit lint invocation for golangci-lint v2 (…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-20T16:03:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9f6628bc583a717cee84814cadcb48a908ef4d6",
          "body": "…08) (#323)\n\n* test(e2e): chromedp coverage for lifecycle ergonomics (livetemplate#408)\n\nAdds browser e2e tests for the lifecycle/Context/Session helpers landed\nin livetemplate#408 and released as v0.9.1:\n\n- IsInitialMount() reflected in server-rendered HTML on HTTP GET\n- IsReconnect() reflected aft\n[…]\n(cosmetic) — both genuine nits, neither blocking.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(e2e): chromedp coverage for lifecycle ergonomics (livetemplate#4…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-14T06:30:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2ead2a9e6e6db346d49ed3525493f822126ad843",
          "body": "* test(e2e): pin explicit-submitter round-trip via chromedp (livetemplate#237)\n\nAdds TestExplicitSubmitter_E2E covering Verification item 3 of\ndocs/proposals/explicit-submitter.md: real-browser round-trip of the\nexplicit \"submitter\" WS field that @livetemplate/client v0.9.0 emits.\n\nA form with two n\n[…]\ny return, instead of GetSent's lock+copy+iterate.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(e2e): pin explicit-submitter round-trip via chromedp (#321)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-13T18:18:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9cdf8468f26f3cc94a4602160e175030edee0d83",
          "body": null,
          "is_bot": false,
          "headline": "chore: bump livetemplate to v0.9.0 (#320)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-13T04:51:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f488d4176df67db682f6ff6805e9561dfe074b0c",
          "body": "…319)\n\nThe framework documentation site is now public — add a prominent link\nnear the top of the README so visitors landing on the lvt repo find\nguides, recipes, and the patterns catalog. The /cli section of the\ndocs site covers this CLI specifically.\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(README): cross-link to https://livetemplate.fly.dev docs site (#…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-03T19:39:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9c2715b6585aaa9fea217cbf98a19473fc0ee03a",
          "body": "Phase 3 of the LiveTemplate docs site automation. When a v* tag is\npushed, fires a repository_dispatch into livetemplate/docs so its\nsync workflow mirrors the new version's markdown.\n\nNeeds a DOCS_DISPATCH_TOKEN secret (PAT with Contents: Read+Write on\nlivetemplate/docs) to actually fire; without the secret the workflow\nruns as a no-op with a warning. Safe to merge before the secret exists.\n\nSee livetemplate/docs/CONTRIBUTING.md → Sync workflow.",
          "is_bot": false,
          "headline": "ci: dispatch livetemplate/docs sync on release tag (#318)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-03T12:22:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91211b7f0565d357db29bf390d39ea484bf96eb8",
          "body": "Release LVT CLI v0.1.6\n\n🤖 Generated with automated release script",
          "is_bot": false,
          "headline": "chore(release): v0.1.6",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-02T09:24:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "093d95fd75c1fe1e3954f9c4f94d8e422e16a3a3",
          "body": "…r (#317)\n\nStreaming-range Phase 6 (livetemplate proposal §379) commits to a single\ncanonical entry point for WebSocket-frame-size assertions across e2e\nsuites. RecordWSFrames is a thin wrapper around NewWSMessageLogger\nfollowed by Start — keeping per-test setup to one line and ensuring\nbounded-WS-s\n[…]\nlementation.\n\nUsed by examples/.../patterns_test.go's TestLargeTable bounded-WS-frame\nsubtests (separate PR in the examples repo).\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(testing): add RecordWSFrames as canonical WS-frame capture helpe…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-02T09:21:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f27b68942baf77ee7aac018dc4b79e5a679757e",
          "body": "* test(e2e): regenerate todos goldens for streaming range Phase 4 wire format\n\nThe livetemplate Phase 4 cleanup (livetemplate#365) changes the wire\nshape for het ranges: kept-item content updates now emit full-tree\nreplacement instead of partial-delta `[\"u\"]` ops, per spec §5d. The\ntodos template he\n[…]\nt.\n\nTo revert after livetemplate#365 merges and is tagged: bump to the\nreleased livetemplate version in a follow-up PR.\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(e2e): regenerate todos goldens for streaming range Phase 4 (#316)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-05-01T17:39:59Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7da0e415a3ba119fafa9849d9b276507e43ec40f",
          "body": "Release LVT CLI v0.1.5\n\n🤖 Generated with automated release script",
          "is_bot": false,
          "headline": "chore(release): v0.1.5",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-04-27T21:50:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7275c8f1d156343d0e293bd3524253a0d06b9805",
          "body": "* fix(testing): respect test PORT/LVT_DEV_MODE over inherited env in StartTestServer\n\nThe previous env construction prepended PORT and LVT_DEV_MODE before\ncmd.Environ(), so any matching var inherited from the parent shell would\noverride the helper's intent — Go's exec resolves duplicate keys with\nla\n[…]\nmode.go, new.go, runtime.go all use os.Environ())\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(testing): respect test PORT/LVT_DEV_MODE over inherited env (#315)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-04-27T21:49:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c27e37e4c612a2a2fc567093835e4f751cf440fa",
          "body": "Release LVT CLI v0.1.4\n\n🤖 Generated with automated release script",
          "is_bot": false,
          "headline": "chore(release): v0.1.4",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-04-26T14:52:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e18781336afff9ce8f79af5f2701c8cf90171357",
          "body": "…pply at 1Hz (#314)\n\n* fix(testing): un-throttle Chrome container so server-pushed renders apply at 1Hz\n\nThe Docker chrome container previously ran with `--cpus 0.5` AND default\nChrome backgrounding heuristics. Both contributed to the same observed\nfailure: server-pushed renders (any test using `ses\n[…]\nw on lvt#314: this feature flag controls a Win32-specific\nocclusion calculation that's already a no-op on Linux Docker. Harmless\nbut noisy. Patterns suite verified passing without it (196s, 32 tests).",
          "is_bot": false,
          "headline": "fix(testing): un-throttle Chrome container so server-pushed renders a…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-04-26T14:47:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "03bca0db11de7ae6c648a3909fd9ba65325a8638",
          "body": "…te (#313)\n\n* refactor: replace id=\"scroll-sentinel\" with lvt-scroll-sentinel attribute\n\nUpdates all generator templates, kit components, golden files, and\nE2E tests to use the new lvt-scroll-sentinel boolean attribute.\nAligns with the framework's lvt-* attribute convention.\n\nCo-Authored-By: Claude \n[…]\nrt \"fix: use real click instead of dispatchEvent for validation test\"\n\nThis reverts commit 76bf781b1bd6ec9165a9fe0e9b03bf5141144af8.\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: replace scroll-sentinel id with lvt-scroll-sentinel attribu…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-04-20T17:37:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1f01b8412a0e2539b3de07cd2e37346a14719d22",
          "body": "* feat: migrate add modal from div+hidden to native dialog+command/commandfor\n\nGenerated resource templates now use native <dialog> with\ncommand=\"show-modal\"/command=\"close\" (Tier 1) instead of\n<div hidden> with lvt-el:toggleAttr+data-lvt-target (Tier 2).\n\nBenefits:\n- Native backdrop, focus trapping\n[…]\nsues when a dialog was recently in the top layer.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: migrate add modal to native dialog + command/commandfor (#312)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-04-11T06:44:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f543135f074689b1909f606135dc343e12527c3",
          "body": "GetClientCSS now returns nil with a log warning when CSS can't be fetched\n(no local file, no cache, CDN 404). ServeCSS returns HTTP 404 instead of\ncrashing the server. Prevents panics in CI where CDN is unreachable.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: gracefully handle missing CSS instead of panicking",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-10T13:29:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "44aecdab4116b843c29e637a4e3de6519db5c4b6",
          "body": "Release LVT CLI v0.1.3\n\n🤖 Generated with automated release script",
          "is_bot": false,
          "headline": "chore(release): v0.1.3",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-10T12:39:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0e77a6df73ba8cda98c8f82e689ba59cb629a000",
          "body": "…script\n\nThe find command for go.mod files was picking up modules inside\n.worktrees/, producing invalid tag names like\n.worktrees/serve-css/components/v0.1.3.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: exclude .worktrees/ from nested module tag discovery in release …",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-10T12:37:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2ac2581b84b8e945c2dfd50ea85d6b45451c9318",
          "body": "The CLI can't read from /var/folders temp dirs (outside sandbox).\nSave to cwd instead, clean up with defer. Also fail the test when\nthe LLM response isn't valid JSON (don't silently swallow errors).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: save screenshot to working directory for Claude CLI sandbox access",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-10T06:18:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ae46a2f0764bbd7dbfbbb7cb941a843afa43e257",
          "body": "Remove anthropic-sdk-go dependency. ValidateScreenshotWithLLM now shells\nout to the 'claude' CLI in non-interactive mode (-p flag). Advantages:\n- No SDK dependency in go.mod\n- No API key management (CLI handles auth)\n- Uses whatever model/auth the user has configured\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: use claude CLI instead of Anthropic SDK for visual checks",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-10T06:08:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "03fb143853a93c1b2976407e5ed64acb742ed27b",
          "body": "Captures a full-page screenshot via chromedp and sends it to Claude for\nvisual analysis. Checks alignment, hierarchy, spacing, error states,\nlayout, and readability. Returns errors for HIGH severity issues.\n\nSkipped by default — only runs when LVT_VISUAL_CHECK=true is set.\nRequires ANTHROPIC_API_KEY. Uses claude-haiku-4-5 for cost efficiency.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add ValidateScreenshotWithLLM() for LLM-powered visual UI review",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-10T05:59:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "82dce8cd8ca2e4dc43da7de9813e81397ed382c4",
          "body": "…hecking\n\nReusable DOM linter that checks rendered pages against Pico CSS conventions:\n- Forms with text input + button should use <fieldset role=\"group\">\n- No unstyled <output data-flash> (use <ins>/<del> instead)\n- No inline styles except <ins>/<del> block pattern\n- No style=\"display:none\" (use hidden attribute)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add ValidatePicoCSS() chromedp action for Pico CSS convention c…",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-10T04:42:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e7c85827c2c569c662e5a2852b87fdb9bef1f1ac",
          "body": "* fix(ci): fix YAML parse error in components-independence workflow\n\nThe heredoc content inside the \"Test external import\" step's `run: |`\nblock had Go code at column 0, which broke the YAML literal block\nscalar (content must be indented at least to the base level). Replace\nthe heredoc with printf t\n[…]\n* style: fix gofmt alignment in testing/chrome.go\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): fix YAML parse error in components-independence workflow (#310)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-04-06T05:25:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1e9976a870c60a432951b709818ed7065fa22165",
          "body": "Add GetClientCSS() and ServeCSS() following the same CDN-fetch-and-cache\npattern as GetClientLibraryJS() and ServeClientLibrary(). Fetches\nlivetemplate.css from unpkg.com with disk cache and expired-cache fallback.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(testing): add ServeCSS for shared LiveTemplate CSS",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-06T04:51:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b1252cfec87d87128da454a912db1c3c47d05034",
          "body": "Release LVT CLI v0.1.2\n\n🤖 Generated with automated release script",
          "is_bot": false,
          "headline": "chore(release): v0.1.2",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-05T15:42:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb9cd5456f590fad57a199df5895ae749b617b37",
          "body": "…ion (#292)\n\n* refactor: move component open/close to client-side CSS classes\n\nMove dropdown, menu, popover, drawer, datepicker, timepicker, and\nautocomplete open/close from server-managed state to client-side CSS\nclass toggling. This eliminates server round-trips for UI-only concerns\nlike dropdown \n[…]\nbtn.form !== null). Use lvt-on:click=\"X\" instead.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat!: attribute reduction — client-side open/close + template migrat…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-04-05T14:51:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9843894291c8f3adc4370c837c40f32dbbc36ff4",
          "body": "Go module proxy requires nested modules (e.g. components/) to be\ntagged as 'components/vX.Y.Z'. The release script now discovers all\nnested go.mod files and creates + pushes the corresponding tags.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(release): auto-tag nested Go modules on release",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-02T17:24:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "91c9217cd5b432562a1a2fa45400e2ffe040d508",
          "body": "Prevents cross-compilation failure caused by go.work pulling in the\nlocal ../livetemplate workspace member (which depends on\ngithub.com/livetemplate/lvt@vX.Y.Z) and trying to verify the freshly\npushed tag against the Go checksum DB before it is indexed.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(release): add GOWORK=off to goreleaser build env",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-02T14:17:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ff99d0744a6e6e9b0102539c067c67791845b815",
          "body": "…ease target repo\n\n- Remove before.hooks (tests already run in release.sh, go mod tidy\n  caused proxy verification failure on freshly pushed tags)\n- Fix release.github pointing to livetemplate/livetemplate → livetemplate/lvt\n- Update release header/footer to reference lvt, not core library\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(release): fix goreleaser config - remove duplicate hooks, fix rel…",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-02T14:16:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d84df035bf7e30fc7dfadb9310c5704f88122ea4",
          "body": "Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(release): pass GITHUB_TOKEN from gh auth for goreleaser",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-02T14:13:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8deb994d0b7fd8952d7c293f2fc9921e6d42b909",
          "body": "Release LVT CLI v0.1.1\n\n🤖 Generated with automated release script",
          "is_bot": false,
          "headline": "chore(release): v0.1.1",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-02T14:08:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fac671ca04a589a19a86af785b96027f68677c66",
          "body": "- Remove core library version fetching and validation\n- LVT now follows its own independent semver trajectory\n- Version menu: patch / minor / major / custom (standard semver bumps)\n- Fix log output captured into version variable (redirect to stderr)\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "fix(release): decouple versioning from core library",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-04-02T14:07:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5d6cea40400cf8e63440d652611ffdd732ea56e5",
          "body": "* chore: improve release.sh with robustness fixes from livetemplate\n\n- Add GOWORK=off to go test and go build to avoid workspace interference\n- Add optional git-chglog support in generate_changelog with fallback\n- Warn (not error) in check_prerequisites if git-chglog is missing\n- Gracefully skip cha\n[…]\nclient-side ephemeral toast pattern from PR #290.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\n\n---------\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>",
          "is_bot": false,
          "headline": "chore: improve release.sh with robustness fixes (#291)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-04-02T11:24:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f267dc4e1614e01bf19d5b409a2a7a19462867d1",
          "body": "* feat(toast): migrate to trigger-attribute pattern (client-side ephemeral component)\n\nServer now emits a lightweight hidden <span data-toast-trigger data-pending='[...]'>\ninstead of full toast HTML. Client reads data-pending after each DOM update and\nmanages toast DOM entirely client-side.\n\n- conta\n[…]\n=\"polite\" confirmed present in client directive (getOrCreateToastStack)\n\nCo-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(toast): migrate to trigger-attribute ephemeral component (#290)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-04-02T03:18:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "53d6d40e692e87e6f15042fa8e704b95c0e2f5b3",
          "body": "* refactor: replace embedded client JS with CDN fetch in testing package\n\nThe testing package embedded a static copy of the LiveTemplate client JS\nthat would get stale during development, causing test failures when the\nserver supported features (like form name routing) the client didn't.\n\nNow fetche\n[…]\nded' error messages in modal and rendering tests.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: replace embedded client JS with CDN fetch in testing (#289)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-27T18:28:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "481e9bafebcf986ff97d01aef80a292c17bbb2e6",
          "body": "…284)\n\n* feat: add database console and scheduled tasks (Roadmap 4.7 + 4.4)\n\nDatabase Console (4.7):\n- `lvt console` (or `lvt db`) opens interactive sqlite3 shell\n- Auto-detects database via DATABASE_PATH env var or app.db in cwd\n- Passes -header -column flags for readable output\n- Prints helpful co\n[…]\nr when periodic job marker not found in worker.go\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add database console and scheduled tasks (Roadmap 4.7 + 4.4) (#…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-25T11:32:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c66f4236be1bed9b75421e75905ff1cd2ea80eb6",
          "body": "* feat: add composable middleware pipeline (Roadmap 3.2)\n\nNew package: pkg/middleware/\n- Chain() composes multiple middlewares into a single middleware\n- Middlewares applied in order: first argument is outermost layer\n- Supports composing chains (chain of chains)\n\nTemplate changes (both multi and si\n[…]\nge to eliminate the disconnect flagged in review.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add composable middleware pipeline (Roadmap 3.2) (#282)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-24T10:08:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "693f3f199c9b1cdc53f23fe7607377e796d709bd",
          "body": "…#283)\n\nThe API handler's internal http.ServeMux with method-based routing\n(GET /api/v1/posts) doesn't work when registered as a subtree handler\non the outer DefaultServeMux (http.Handle(\"/api/v1/posts/\", handler)).\nThe outer mux's subtree matching interferes with the inner mux's\nmethod routing.\n\nFi\n[…]\negisterRoutes(http.DefaultServeMux, queries) into main.go.\n\nFound via E2E testing: all API endpoints returned 404 before this fix.\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: API route registration — use RegisterRoutes instead of sub-mux (…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-24T09:28:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "52369afa2f81fb385b8460c3cdf17473492f5156",
          "body": "…tion (Roadmap 3.3) (#281)\n\nEnhances the generated logging middleware in both multi and single kits:\n\n- Request ID: propagates incoming X-Request-ID header or generates one,\n  returns it in response for distributed tracing\n- Sensitive data redaction: query parameters matching password, token,\n  secr\n[…]\n\n  (default 1000ms) logged at WARN level instead of INFO\n- Query string logging: non-sensitive query params included in log output\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: enhance request logging with request IDs, redaction, slow detec…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-23T08:12:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4ffd25d56ef4bffee9e2fed139da4e798a1d8e49",
          "body": "… (#280)\n\nNew package: pkg/cache/\n- Cache interface: Get(key) → ([]byte, bool, error), Set, Delete, Flush\n- GetJSON/SetJSON generic helpers for type-safe cached values\n- MemoryCache: LRU eviction (container/list) + TTL expiration,\n  background cleanup goroutine, thread-safe with sync.RWMutex\n- SQLit\n[…]\n TTL expiration,\nLRU eviction, delete, flush, overwrite, concurrent access (race-safe),\nJSON round-trip, HTTP header verification.\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add caching layer with memory and SQLite backends (Roadmap 3.1)…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-23T08:11:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5fdec1fe871d64bf1ae942cff9ec12cbc555926f",
          "body": "* feat: add API / JSON endpoint generation (Roadmap 2.4)\n\nNew command: lvt gen api <resource> <fields...>\nGenerates pure HTTP REST JSON endpoints — no LiveTemplate, no WebSocket.\n\nNew package: pkg/cors/\n- CORS middleware with functional options (WithOrigins, WithMethods, etc.)\n- Preflight OPTIONS ha\n[…]\nyle: fix go fmt formatting in integration_test.go\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add API / JSON endpoint generation (Roadmap 2.4) (#279)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-23T08:06:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "27d3c07707af005fe0999bbd4d1068fd41b85347",
          "body": "* feat: add authorization / RBAC system (Roadmap 2.3)\n\nAdd role-based access control with ownership tracking for generated resources.\n\nNew package: pkg/authz/\n- Policy interface with DefaultPolicy (admin=all, user=create+list, owner=edit+delete)\n- RequireRole HTTP middleware with 403 Forbidden (HTML\n[…]\nn-ownable resource denial\n- Fix go fmt formatting\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add authorization / RBAC system (Roadmap 2.3) (#273)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-22T03:53:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "420d65035b61f99253cc76007fdc08cd58fbd0ae",
          "body": "* feat: add file upload & storage support for generated resources\n\nAdd file/image field types to the code generator, enabling resources\nlike `lvt gen resource gallery title:string photo:image doc:file`.\n\nNew packages:\n- pkg/storage: Store interface with LocalStore (filesystem) and S3Store\n- pkg/s3pr\n[…]\nocument idempotent behavior\n- Update golden files\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add file upload & storage support (Roadmap 2.2) (#267)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-21T15:36:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5209c41590aa463caa85d3102ef9e1bc536e3196",
          "body": "* feat: add background job queue system using River (#2.1)\n\nAdd `lvt gen queue` and `lvt gen job <name>` commands that scaffold\nbackground job processing using River (https://riverqueue.com), the\nde facto Go job queue library with 4.8k stars.\n\nRiver handles all queue/worker internals: worker pool, r\n[…]\nifying imports, River setup code, and idempotency\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add background job queue system using River (#261)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-21T06:06:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a110d6c10d257fbd952f21c3235389b9136a9e24",
          "body": "* feat: add smart form validation with field types, HTML5 attrs, and password confirmation\n\nAdd specialized field types (email, url, phone/tel, password) that generate\nappropriate Go validation tags and HTML5 input attributes. Replace template-level\nGoType branching with metadata-driven ValidateTag,\n[…]\nce server-side validation was\nno longer enforced.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: smart form validation with field types and HTML5 attrs (#255)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-19T22:32:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fe46094d321ab4cb9929e35ac802e44c40c1a796",
          "body": "* feat: add per-IP rate limiting for global and auth endpoints (roadmap 1.2)\n\nAdd brute-force protection via token-bucket rate limiting with per-IP\ntracking and LRU eviction.\n\nTwo rate limiter instances in generated apps:\n- Global (100 rps, burst 200): wraps the entire mux, prevents general abuse\n- \n[…]\neries only) so the generated code still compiles.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add per-IP rate limiting for global and auth endpoints (#248)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-18T18:17:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4f218f3fec4cdde9d141eef9c2d2fb42a62e5e73",
          "body": "Add SMTPEmailSender in pkg/email/ wrapping wneessen/go-mail for production\nemail delivery. Includes env-based factory (NewEmailSenderFromEnv) supporting\nconsole/smtp/noop providers, port range validation, TLS documentation.\n\nAuth handler template refactored with newController() helper eliminating\n6x\n[…]\ns to ConsoleEmailSender (compatible\nwith released module); follow-up PR will switch to NewEmailSenderFromEnv()\nafter next release.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add production SMTP email sender wrapping go-mail (#245)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-16T18:48:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1c5d2d534191c8d20efc50be811555cc069aa50",
          "body": "Reorder milestones to prioritize features closest to production readiness:\n- Email Sending promoted to 1.1 (~40% done, unblocks production auth)\n- Rate Limiting promoted to 1.2 (security blocker for exposed auth endpoints)\n- Form Validation scoped down to \"Enhancements\" in 1.3 (validator/v10 works)\n\n[…]\nnfrastructure\n- Updated feature matrix to reflect actual implementation status\n- Fixed cross-references between dependent sections\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: refine roadmap prioritization based on implementation state (#244)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-16T01:52:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c02f3aaaf2051ce3d4e1e7b492c31e5c0c223f8b",
          "body": "…ment (#227)\n\n* fix: optimize Fly.io stack templates — remove CGO, fix fly.toml placement\n\nAligns the Fly stack generator with the Docker template optimizations from\nPR #221. Also fixes structural issues discovered during a real Fly.io\ndeployment of a blog app with authentication.\n\nDockerfile.tmpl:\n\n[…]\n succeed during\nlocal development; actual deployment still requires go.sum.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: optimize Fly.io stack templates — remove CGO, fix fly.toml place…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-15T14:47:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87ab4288df8b3f0afe3d56c2ebae020ac354882e",
          "body": "* docs: add feature gap roadmap comparing lvt with major web frameworks\n\nResearch and analysis of 18 missing features comparing lvt CLI against\nRails 8, Phoenix LiveView, Laravel 12, Django, and Go frameworks.\nOrganized into 4 prioritized milestones with acceptance criteria.\n\nhttps://claude.ai/code/\n[…]\nlinks (speculative future-dated URLs)\n- Add Django Channels documentation to sources\n\nhttps://claude.ai/code/session_016oonafM6QzJUh9zpPYsQhk\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add comprehensive feature gap roadmap for production readiness (#229)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-15T14:45:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "790d317078e911caa95d0a8f91bc4bdd121e478f",
          "body": "verifyAppBuildsAndRuns was writing server output directly to os.Stderr,\nwhich races with runLvtCommandWithOutput temporarily redirecting\nos.Stderr in parallel tests. Write to a per-app log file instead.\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: eliminate data race on os.Stderr in parallel e2e tests (#228)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-15T07:30:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "00cdb61591a308b7712d4ce3c27e56f6094618b6",
          "body": "…enerate Makefile (#221)\n\n* feat: optimize Docker deployment — remove CGO, conditional compose, generate Makefile\n\n- Remove CGO_ENABLED=1, gcc, musl-dev, sqlite-dev from Dockerfile (modernc.org/sqlite is pure Go)\n- Remove sqlc download/generation from Docker build (models should exist in source tree\n[…]\ne_First_Post and\nCreate_Second_Post subtests) and ensureTutorialPostExists.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: optimize Docker deployment — remove CGO, conditional compose, g…",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-14T19:30:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ec71ae74f919e8e502a4deeb25115cf2ef88978a",
          "body": "Update livetemplate dependency from pseudo-versions to the tagged v0.8.4\nrelease in both root and components go.mod. Also update the embedded JS\nclient for E2E testing.\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump livetemplate to v0.8.4 (#220)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-14T18:15:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "69bbcc117d0e5387b915d5da8c09dc96ad3a39e7",
          "body": "* refactor: remove evolution system, MCP server, interactive gen mode, stale docs\n\nPhase 1 cleanup for production pipeline:\n\n- T1: Remove evolution system — delete internal/evolution/, commands/evolution.go,\n  evolution/ directory, and all evolution tests. Keep internal/telemetry/ (used by\n  gen and\n[…]\nng why interface{} is used\n  over normalizing at deserialization boundaries\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: embedded child resources, mount fix, toast auto-dismiss (#209)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-14T09:17:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "782b1430f6715ff0af5ed4c2e99da7718eb747e6",
          "body": "* fix: update golden files for corrected $index resolution in range\n\nThe core library (livetemplate/livetemplate#179) fixed a bug where\nrange variables in executeRangeBodyWithVars were stored with the $\nprefix, causing buildExecData to construct \"$$index\" patterns that\nnever matched {{$index}} in te\n[…]\nlivetemplate main branch\nwhich fixes $index resolution in pipe expressions.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: update golden files for corrected $index resolution in range (#208)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-13T06:35:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f0616a39252aa9676893daea4a7abd39b529dc0",
          "body": "* fix: style system template fixes — adapter fields, branching, dedup (#166, #171, #173, #174, #191)\n\n- #166: Accordion single.tmpl — conditional class attribute to avoid empty class=\"\"\n- #173: Dropdown searchable.tmpl — add SearchWrapper style field, replace hardcoded \"relative\"\n- #174: Datepicker \n[…]\nf}} to avoid\n  empty class=\"\" for third-party adapters that omit HelperText\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: style system template fixes — batch 3 (#202)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-08T08:59:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5557cba7451cfe382883da3f21aefa5f89fa75f3",
          "body": "* fix: quick wins batch 2 — type safety, rename, parser, CLI edge case (#184, #187, #198, #199, #200)\n\n- Rename ComputeComponentUsage (clearer than DefaultComponentUsage) (#198)\n- Add LocationType string type for compile-time safety on location constants (#199)\n- Use strconv.Unquote for matched-pair\n[…]\nreports\nthe actual value being used rather than always showing the default.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: quick wins batch 2 — type safety, parser, CLI fixes (#201)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-08T08:23:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d03a2fd81654d69900de5cdd82b84224d77cf4f",
          "body": "* fix: quick wins batch — renames, constants, alignment, quoting (#154, #185, #186, #192, #195, #196)\n\n- Rename component_proposer.go → location_classifier.go (#185)\n- Add Location* constants, replace string literals (#186)\n- Rename DetectUsedComponents → DefaultComponentUsage (#154)\n- Add coupling \n[…]\nct.go:74).\nThis is needed after the %q quoting change in SaveProjectConfig.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: quick wins batch — renames, constants, alignment, quoting (#197)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-08T05:59:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "46a7bbc69c155a4e8b4f9a3ea09080ad76b869a3",
          "body": "…(#190)\n\n* fix: resolve style system bugs in handler templates, autocomplete, and dropdown (#163, #164, #165, #172)\n\n- Gate style adapter import on .Styles value so --styles unstyled generates\n  correct import instead of always importing tailwind (#163)\n- Add SelectedBadge and SelectedBadgeBtn field\n[…]\ncate checks from CLI and UI callers. Add test\nfor invalid styles rejection.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve style system bugs in templates (#163, #164, #165, #172) …",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-07T20:33:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dca6a4efaabf5d249bf77f10eaf5a1171bd0417d",
          "body": "* feat: add component attribution to telemetry (#78)\n\nAdd ComponentsUsed and ComponentErrors fields to GenerationEvent so\ntelemetry can answer \"which component caused this failure?\" and\n\"how often does modal break?\". This is the foundation for the\ncomponent health dashboard (#79) and fix proposer (#\n[…]\nusers don't know where\nto run go mod tidy. Now prints the path for clarity.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: enhance component independence CI checks (#81) (#179)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-07T08:49:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e43ef8473c67cc7f6f7ff8efe4d7dbf44423ad67",
          "body": "* feat: add component attribution to telemetry (#78)\n\nAdd ComponentsUsed and ComponentErrors fields to GenerationEvent so\ntelemetry can answer \"which component caused this failure?\" and\n\"how often does modal break?\". This is the foundation for the\ncomponent health dashboard (#79) and fix proposer (#\n[…]\nusers don't know where\nto run go mod tidy. Now prints the path for clarity.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: component attribution to telemetry (#78) (#177)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-07T08:48:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91a408ecab71f98eaaa4d8716cd8aef2e805f3ce",
          "body": "Add paths-ignore for docs/**, **/*.md, and LICENSE to the test\nworkflow. Bot reviewer workflows (Claude, Copilot) are intentionally\nkept running on all PRs.\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "ci: skip heavy workflows for docs-only changes (#182)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-07T08:01:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fceda5ee6d66d36118df6d4e8f97d3b0aabfbc42",
          "body": "auth-customization.md and lvt-cli-guide.md were previously maintained\nin the livetemplate core library repo. Moved here where they belong.\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add lvt-specific guides moved from core library (#181)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-07T06:44:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7ef219a7d85ca1c78b029356ecbd96db1d072883",
          "body": "* fix: add replace directives before GenerateAuth in tests\n\nGenerateAuth runs `go get github.com/livetemplate/lvt@latest` which\ntransitively requires lvt/components — a local-only sub-module not\npublished to any module proxy. Without replace directives in the\ngenerated app's go.mod, the resolution f\n[…]\nComponentsForTest() which copies components\ninto the app directory instead.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add replace directives before GenerateAuth in tests (#180)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-04T06:51:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "11988541ef4e4552a09f4c1214b330fbaaf6fe8c",
          "body": "* feat: add StyleAdapter interface, per-component style structs, and registry (#73)\n\nIntroduces the style adapter system that makes CSS frameworks swappable.\nComponents will resolve their CSS classes through a StyleAdapter instead\nof hardcoding Tailwind classes.\n\n- StyleAdapter interface with 29 met\n[…]\nSleep. Also increase timeout\nto 180s to match other validation tests in CI.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Milestone 5 — Style Adapter System (#73–#77) (#162)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-03-02T09:12:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "90e9376ec6a2d5b0dda42d7305a4624573e1d5b7",
          "body": "- Fix doc comment and test strings in eject package that still\n  referenced github.com/livetemplate/components (old standalone repo)\n- Sync dependency versions across workspace via go work sync\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: update stale component import paths and sync workspace deps",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-03-01T07:25:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c00a45caae956dd56279a814ff24270b6f4cbfde",
          "body": "* Squashed 'components/' content from commit b3d1351\n\ngit-subtree-dir: components\ngit-subtree-split: b3d1351c7d64686e059e1dd510f45272b943524a\n\n* feat: Milestone 4 — Components Integration (Issues #68–#72)\n\nMove the external components library into the monorepo and wire modal,\ntoast, and dropdown com\n[…]\nTemplates\nregistration for dropdown to avoid loading unused template files.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Milestone 4 — Components Integration (#68–#72) (#142)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-28T15:30:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "08907d9c703678deb201d0a3305cf4388c572cba",
          "body": "In CI headless Docker Chrome, CSS overflow containers may have zero\ndimensions (scrollHeight=0, clientHeight=0). The scroll directives test\nnow: tries to force layout via JS inline styles, falls back gracefully\nif container remains non-scrollable, and removes EmulateViewport which\nmade dimensions worse.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: handle zero-dimension scroll container in headless Docker Chrome",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-02-28T06:34:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6c4b38ebb7b710e1a8d00623582334ffd31ba524",
          "body": "- InfiniteScroll: call loadMore() directly instead of relying on\n  IntersectionObserver which doesn't fire in headless Docker Chrome\n- Scroll Directives: add EmulateViewport to ensure CSS layout works,\n  force layout recalc after scroll, add diagnostic logging\n- Both tests use waitForDOM instead of waitFor (no client diagnostics\n  needed for pure DOM tests)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: improve scroll test reliability for headless Docker Chrome",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-02-28T06:14:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a08152dcbe20d185f4e8145a54178f9002f38231",
          "body": "…ability\n\nReplace chromedp.Click with direct JS function calls (scrollToBottom,\nscrollToTop) and use scrollIntoView instead of scrollTop assignment.\nchromedp.Click doesn't reliably trigger inline onclick handlers in\nheadless Docker Chrome, and scrollTop assignment doesn't trigger\nIntersectionObserver because the layout/paint cycle may be skipped.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use direct JS calls in scroll E2E tests for headless Chrome reli…",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-02-28T05:54:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "78dabda6a9783935875ac964983350abb6c7f39e",
          "body": "Scroll directive and infinite scroll tests used fixed time.Sleep delays\nthat were too short for Docker Chrome in CI. Replace with proper\nwaitFor polling on DOM conditions with generous 10s timeouts for\nreliable CI execution.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: replace time.Sleep with waitFor polling in browser E2E tests",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-02-27T23:53:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9c781599ad0ce1b74d8a59545d589de9413fe5b9",
          "body": "* feat: Milestone 3 — Telemetry & Evolution (Issues #61–#67)\n\nAdd self-improving evolution system that captures generation events,\nmatches errors to known patterns, proposes fixes, and tests them in\nisolation. This creates a feedback loop: capture → match → propose → test.\n\nNew packages:\n- internal/\n[…]\nic.com>\n\n* fix: mark unused args parameters with _ in evolution subcommands\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Milestone 3 — Telemetry & Evolution (Issues #61–#67) (#130)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-25T19:01:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e239efc191ffada3d0f89933e7ff9b03465128d5",
          "body": "RuntimeCheck.Run() reads appOut.Bytes() to build error messages when\nthe subprocess fails to start. However, os/exec spawns an internal\ngoroutine that copies subprocess pipes into appOut, and that goroutine\nonly stops when cmd.Wait() returns. Reading appOut before Wait()\ncompletes is a data race det\n[…]\nstopProcess() function and call it\nbefore reading appOut.Bytes() in the !ready branch, ensuring the pipe\ncopier goroutine has finished writing.\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: data race in RuntimeCheck.Run reading appOut before cmd.Wait (#131)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-24T06:10:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6f67c757be885a651e738054badc8e8d21eccb03",
          "body": "* feat: add validation layer — RuntimeCheck, CLI integration, MCP integration (#58, #59, #60)\n\nMilestone 2 validation layer:\n\n- Add RuntimeCheck (build binary, start app, probe HTTP routes) with full\n  test coverage including timeout, route probing, and process cleanup\n- Add PostGenEngine for lightw\n[…]\npic.com>\n\n* fix: add explanatory comment on FullEngine construction pattern\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: Milestone 2 — Validation Layer (Issues #58, #59, #60) (#121)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-22T16:32:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5b6c92fb3fa4896b65e4f7c8c54112b1e9867cf3",
          "body": "fix(ci): remove invalid secrets reference from workflow",
          "is_bot": false,
          "headline": "Merge pull request #120 from livetemplate/fix-deployment-tests-yaml",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-22T06:53:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b66b1c6b34549f7824d0ef2dc8826779b9499fc",
          "body": "The `secrets` context is not available in step-level `if:` expressions\nin GitHub Actions, causing the entire workflow to be rejected as invalid\nYAML. Move the secret-presence check into the step's `run:` script\nwhere it can be accessed via the `env:` mapping.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ci): remove invalid secrets reference from step-level if expression",
          "author_name": "Adnaan",
          "author_login": "adnaan",
          "committed_at": "2026-02-22T05:35:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2ea099f829b45e234cfbf9d39221bc54ae76f53f",
          "body": "* feat: add unified validation engine package (#57)\n\nAdd internal/validation/ package that validates generated LiveTemplate\napps programmatically: go.mod structure, template syntax, SQL migrations\n(via in-memory SQLite), and compilation. Reuses existing validator types\nand runs checks sequentially w\n[…]\n to assert specific warning\n  or error depending on whether sqlc is in PATH\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add unified validation engine package (#116)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-22T05:20:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b0365d88090f12ca8ff742401338e4752b6ca921",
          "body": "Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: upgrade Go to 1.26 (#117)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-21T19:56:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9137ed616b84910a8a1b2bde162b799d56a8681a",
          "body": "* fix(kits): add missing delete button to single kit edit modal (#56)\n\nThe single kit's monolithic template was missing a delete button in the\nedit modal, unlike the multi kit which had Update | Delete | Cancel.\nAdd the delete button and a parity test to prevent future drift.\n\nCo-Authored-By: Claude\n[…]\nsmoke test\n- Use fmt.Sprintf instead of strings.Replace for path formatting\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(kits): add missing delete button to single kit edit modal (#106)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-19T06:01:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5ed97f799f1976ad27733a6094396524c2350aae",
          "body": "* test(e2e): extend wire format tests with statics resend, metadata, and schema validation\n\nAdd 3 new subtests and findMetadata helper to wire_format_test.go:\n- Subtest 8: validates structure change (conditional reappearing) resends statics via fingerprint mismatch\n- Subtest 9: validates range metad\n[…]\ndepends on subtest 7 state)\n- Add minimum message count check in subtest 10\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(e2e): extend wire format tests (#96) (#105)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-16T19:14:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "079ce804c57abee379d7c6874e444719f0713167",
          "body": "Validate generated .tmpl files immediately after writing them so\ntemplate syntax errors are caught at generation time instead of runtime.\nError messages include file path, line number, and surrounding source\ncontext with an arrow marker for quick identification.\n\nCloses #55\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(generator): add template parse validation after generation (#103)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-15T18:36:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c51fc9066d4d460ac33f001a4832823ec5640c81",
          "body": "…(#104)\n\nThe workflow only had workflow_dispatch and schedule triggers, so GitHub\ndetected the file on PRs but had no matching trigger, producing an error.\nAdd a pull_request trigger scoped to deployment-related paths. On PRs\nonly mock tests run; Docker/Fly tests remain manual/scheduled only.\n\nhttps://claude.ai/code/session_01NkKNvLdDz2DZG7dMEANEEQ\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix deployment-tests workflow failing with \"No jobs were run\" on PRs …",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-15T18:35:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b35f384b01f39d999937b9a445916c5f3dbd1967",
          "body": "EditingID is declared as string in handler structs, but the multi kit\nand generator templates compared it to integer 0, causing Go template\ntype errors at render time. The single kit was already fixed in 5700a82.\n\nFixes #54\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: compare EditingID to empty string instead of integer 0 (#101)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-15T17:05:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "32674275145c8f97db572622070ed2442d43dfc0",
          "body": "Remove the SKIP_GO_MOD_TIDY environment variable that was masking\nreal dependency resolution issues in agent tests. Tests now run\ngo mod tidy during app creation, matching real-world behavior.\n\nCloses #53\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(testing): remove SKIP_GO_MOD_TIDY from agent tests (#100)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-15T07:49:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f8b35dad8c416ed049a00d8959d9f868e7435659",
          "body": "* test(e2e): add wire format integration test with TypeScript client (#96)\n\nValidates the complete wire format path: Go server generates tree →\nJSON over WebSocket → TypeScript client applies to DOM. First real\nconsumer of WSMessageLogger infrastructure.\n\nTests 7 wire format scenarios: initial rende\n[…]\nve_item operations\n  instead of using forward-looking waitForActionResponse\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(e2e): wire format integration test with TypeScript client (#87)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-12T19:19:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1dcda39aaf8d3a3431521d1b3dc44acc800b6dff",
          "body": "* Add compilation validation to E2E tests\n\nIntroduce a ValidateCompilation helper that runs sqlc generate, go mod\ntidy, and go build ./... after resource generation in E2E tests. This\ncatches type mismatches, missing dependencies, and syntax errors in\ngenerated code before they reach production.\n\nCh\n[…]\nhGOWORKOff()\n- sqlc @latest is consistent with all other invocations in the codebase\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add compilation validation to e2e tests (#86)",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-12T19:19:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab692159a0a6b4f02849c5dee86b22b74187370d",
          "body": "…(#85)\n\n* refactor(testing): add Docker Chrome helpers for reliable CI testing\n\n- Add SetupDockerChrome() helper to simplify Docker Chrome setup in tests\n- Add WaitForServer() helper to replace arbitrary time.Sleep() calls\n- Refactor loading indicator and focus preservation tests to use:\n  - Dynamic\n[…]\nost)\n- GetChromeTestURL() only for chromedp navigation (runs inside Docker)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(testing): add Docker Chrome helpers for reliable CI testing …",
          "author_name": "Adnaan Badr",
          "author_login": "adnaan",
          "committed_at": "2026-02-07T08:06:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 9,
      "commits_last_year": 182,
      "latest_release_at": "2026-07-18T10:18:04Z",
      "latest_release_tag": "v0.2.0",
      "releases_from_tags": false,
      "days_since_last_push": 4,
      "active_weeks_last_year": 29,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 13.3
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 62,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/livetemplate/lvt",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/livetemplate/lvt",
          "is_deprecated": false,
          "latest_version": "v0.2.0",
          "repository_url": "https://github.com/livetemplate/lvt",
          "versions_count": 9,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T10:16:34Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "github.com/livetemplate/lvt/components",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/livetemplate/lvt/components",
          "is_deprecated": false,
          "latest_version": "v0.2.0",
          "repository_url": "https://github.com/livetemplate/lvt",
          "versions_count": 9,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T10:16:34Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 90
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "components/go.mod",
        "go.mod"
      ],
      "largest_source_bytes": 91935,
      "source_files_sampled": 390,
      "oversized_source_files": 1,
      "agent_instruction_files": [
        ".aider/.aider.conf.yml",
        ".cursor/rules/lvt.md",
        ".github/copilot-instructions.md"
      ],
      "agent_instruction_max_bytes": 8194
    },
    "dependencies": {
      "manifests": [
        "components/go.mod",
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/livetemplate/livetemplate",
          "manifest": "components/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.9.0"
        },
        {
          "name": "github.com/livetemplate/livetemplate",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.19.0"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.41.1"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/config",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.32.7"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/credentials",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.19.7"
        },
        {
          "name": "github.com/aws/aws-sdk-go-v2/service/s3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.95.1"
        },
        {
          "name": "github.com/brianvoe/gofakeit/v7",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v7.8.2"
        },
        {
          "name": "github.com/charmbracelet/bubbles",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.21.0"
        },
        {
          "name": "github.com/charmbracelet/bubbletea",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.10"
        },
        {
          "name": "github.com/charmbracelet/lipgloss",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.1.0"
        },
        {
          "name": "github.com/chromedp/cdproto",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-20250803210736-d308e07a266d"
        },
        {
          "name": "github.com/chromedp/chromedp",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.14.2"
        },
        {
          "name": "github.com/disintegration/imaging",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.2"
        },
        {
          "name": "github.com/gorilla/websocket",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.5.3"
        },
        {
          "name": "github.com/livetemplate/lvt/components",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0-00010101000000-000000000000"
        },
        {
          "name": "github.com/mattn/go-sqlite3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.14.32"
        },
        {
          "name": "github.com/pressly/goose/v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.26.0"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.0"
        },
        {
          "name": "github.com/wneessen/go-mail",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.7.2"
        },
        {
          "name": "golang.org/x/crypto",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.47.0"
        },
        {
          "name": "golang.org/x/mod",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.33.0"
        },
        {
          "name": "golang.org/x/net",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.49.0"
        },
        {
          "name": "golang.org/x/text",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.35.0"
        },
        {
          "name": "golang.org/x/time",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.14.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.43.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": 109,
        "open_issues": 90,
        "closed_ratio": 0.602,
        "closed_issues": 136,
        "closed_unmerged_prs": 4
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "adnaan",
          "commits": 182,
          "avatar_url": "https://avatars.githubusercontent.com/u/758447?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "claude-code-review.yml",
        "claude.yml",
        "components-independence.yml",
        "deployment-tests.yml",
        "dispatch-docs-sync.yml",
        "test.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 0,
            "reason": "branch protection not enabled on development/release branches",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
          },
          {
            "name": "CI-Tests",
            "score": 10,
            "reason": "21 out of 21 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": 10,
            "reason": "no dangerous workflow patterns detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "26 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": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": 0,
            "reason": "Project has not signed or included provenance with any releases.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "34 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "beb560884c92dd9fdc796cb633095b45be6d67d5",
        "ran_at": "2026-07-24T01:52:03Z",
        "aggregate_score": 3.1,
        "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-19T05:44:50Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-19T05:44:48Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": [
        {
          "number": 30,
          "created_at": "2026-01-11T08:44:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 88,
          "created_at": "2026-02-14T19:15:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 97,
          "created_at": "2026-02-14T19:16:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 119,
          "created_at": "2026-02-22T05:22:51Z",
          "last_comment_at": "2026-02-22T05:23:07Z",
          "last_comment_author": "claude"
        },
        {
          "number": 124,
          "created_at": "2026-02-22T18:01:52Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 132,
          "created_at": "2026-02-26T19:06:09Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 133,
          "created_at": "2026-02-26T19:06:21Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 134,
          "created_at": "2026-02-26T19:06:25Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 137,
          "created_at": "2026-02-26T19:06:46Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 144,
          "created_at": "2026-02-28T17:09:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 148,
          "created_at": "2026-02-28T17:10:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 150,
          "created_at": "2026-02-28T17:10:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 151,
          "created_at": "2026-02-28T17:10:35Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 152,
          "created_at": "2026-02-28T17:10:39Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 153,
          "created_at": "2026-02-28T17:10:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 156,
          "created_at": "2026-02-28T17:10:59Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 157,
          "created_at": "2026-02-28T17:11:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 160,
          "created_at": "2026-02-28T17:11:14Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 161,
          "created_at": "2026-02-28T17:11:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 167,
          "created_at": "2026-03-03T06:13:50Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/livetemplate/lvt",
    "host": "github.com",
    "name": "lvt",
    "owner": "livetemplate"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 58,
      "inputs": {
        "security": 31,
        "vitality": 86,
        "community": 33,
        "governance": 50,
        "engineering": 80
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "commits_last_year": 182,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 29
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "29/52 weeks with commits",
                "points": 20.1,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 29
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "182 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 182
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "26 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": "excellent",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "releases_count": 9,
              "latest_release_tag": "v0.2.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 13.3
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "9 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~13.3 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 13.3
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "maintained",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": null,
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": 4,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 4 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "at_risk",
        "name": "Community & Adoption",
        "value": 33,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "good",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 70,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": true,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 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": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 50,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 65,
            "inputs": {
              "merged_prs": 109,
              "open_issues": 90,
              "closed_issues": 136,
              "issue_closed_ratio": 0.602,
              "closed_unmerged_prs": 4
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "60% of issues closed",
                "points": 28.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 60
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "109/113 decided PRs merged",
                "points": 36.9,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 109,
                      "decided": 113
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 42,
            "inputs": {
              "followers": 2,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "livetemplate",
              "public_repos": 9,
              "account_age_days": 279
            },
            "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": "2 followers of livetemplate",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "livetemplate"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "9 public repos, account ~0 yr old",
                "points": 8.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 9
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/livetemplate/lvt",
                "github.com/livetemplate/lvt/components"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "9 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "max_points": 20
              },
              {
                "key": "not_deprecated",
                "name": "Not deprecated",
                "detail": "active, not deprecated or yanked",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "package_not_deprecated",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
      },
      {
        "key": "engineering",
        "band": "good",
        "name": "Engineering Quality",
        "value": 80,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "6 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "21 out of 21 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 31,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Packaging. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 31,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 3.1
            },
            "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": "21 out of 21 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "26 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": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "Project has not signed or included provenance with any releases.",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "34 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 1
            },
            "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": 80,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [
                ".aider/.aider.conf.yml",
                ".cursor/rules/lvt.md",
                ".github/copilot-instructions.md"
              ],
              "agent_instruction_max_bytes": 8194
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": ".aider/.aider.conf.yml, .cursor/rules/lvt.md, .github/copilot-instructions.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".aider/.aider.conf.yml, .cursor/rules/lvt.md, .github/copilot-instructions.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 84,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": true,
              "typed_language": true,
              "bootstrap_files": [
                "Makefile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0.83,
              "toolchain_manifests": [
                "components/go.mod",
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "Dockerfile, lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Dockerfile, lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "83 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 83,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "automated_maintenance",
                "name": "Automated maintenance",
                "detail": "no automated dependency updates observed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_dependency_automation",
                    "params": {}
                  }
                ],
                "max_points": 8
              },
              {
                "key": "openssf_scorecard_pinned_dependencies",
                "name": "OpenSSF Scorecard: Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "Go",
              "largest_source_bytes": 91935,
              "source_files_sampled": 390,
              "oversized_source_files": 1
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "1/390 source files over 60KB",
                "points": 54.9,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 390,
                      "oversized": 1
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "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? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T01:52:17.461545Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/l/livetemplate/lvt.svg",
  "full_name": "livetemplate/lvt",
  "license_state": "standard",
  "license_spdx": "MIT"
}

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

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

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