公开记录
软件健康报告模式 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年11月在 GitHub 上查看 ↗

livetemplate/lvt 的健康指数为 100 分中的 58 分,处于「中等」区间。 其得分最高的类别是Vitality(86/100),最低的是Security(31/100)。 最近一次更新在 4 天前。 近期的大部分工作由 1 位贡献者完成。

58
总分 / 100
中等

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

58
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

2 关注者9 个公开仓库始于 2025年10月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/livetemplate/lvtv0.2.0-95 天前
Gogithub.com/livetemplate/lvt/componentsv0.2.0-95 天前

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

86优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 4 天前
20.1/36提交节奏 — 52 周中有 29 周有提交
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

发布纪律

90优秀
评分方式
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

社区健康

70良好
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
18/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
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议题解决 — 60% 的议题已关闭
36.9/38.3PR 接受 — 已裁定的 PR 中 109/113 已合并
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
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
3.4/25所有者影响力 — livetemplate 有 2 位关注者
8.8/25既往记录 — 9 个公开仓库,账户约 0 年
所用输入
followers2
owner_typeOrganization
is_verified
owner_loginlivetemplate
public_repos9
account_age_days279
评分方式
25/25已发布且可解析 — go 上有 2 个软件包
35/35发布时效 — 最近一次发布于 5 天前
20/20版本历史 — 9 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/livetemplate/lvt, github.com/livetemplate/lvt/components
ecosystemsgo
any_deprecated
min_days_since_publish5

工程质量

基础的工程与文档实践是否到位?

80良好 · 占总体的 20%

工程实践

84良好
评分方式
24/24CI 工作流 — 6 个工作流
24/24存在测试
16/16Linter 配置 — .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

文档

75良好
评分方式
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。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 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/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — Dockerfile, lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 83 次由代理编写或署名代理
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可控的文件大小 — 采样的 390 个源文件中有 1 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes91,935
source_files_sampled390
oversized_source_files1

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

0GitHub 星标
1贡献者
182最近 12 个月提交数
4距最近推送天数
9发布版本数
1巴士系数(bus factor)
90开放议题
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.