公开记录
软件健康报告模式 0.26.0 · 指标 1.13.0 · 2026-07-22 03:26 UTC

Educentr / go-project-starter

Fast and easy start you go project

Go · Go Template未检测到许可证★ 3 星标⑂ 1 复刻始于 2025年10月在 GitHub 上查看 ↗

Educentr/go-project-starter 的健康指数为 100 分中的 57 分,处于「中等」区间。 其得分最高的类别是Vitality(92/100),最低的是Community & Adoption(24/100)。 最近一次更新在 4 天前。 近期的大部分工作由 1 位贡献者完成。

57
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

Educentr组织
2 关注者18 个公开仓库始于 2024年5月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/Educentr/go-project-starterv0.26.1-994 天前

按类别列示的指标

活力

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

92优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 4 天前
22.2/36提交节奏 — 52 周中有 32 周有提交
18/18提交量 — 最近一年 237 次提交
10/10OpenSSF Scorecard:Maintained — 18 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year237
human_commit_share1
days_since_last_push4
active_weeks_last_year32

发布纪律

100优秀
评分方式
27/27有发布版本 — 已发布 67 个发布版本
36/36发布时效 — 最近一次发布版本于 4 天前
27/27发布节奏 — 约每 12.9 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count67
latest_release_tagv0.26.1
releases_from_tags
days_since_latest_release4
mean_days_between_releases12.9
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

24危急 · 占总体的 18%
评分方式
4.9/60星标 — 3 个星标
0/25复刻 — 1 个复刻
0/15关注者 — 1 位关注者
所用输入
forks1
stars3
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold

社区健康

45存在风险
评分方式
22.5/22.5README
0/22.5许可证 — 未检测到许可证文件
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

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

52中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
9.4/22.5提交分布 — 头号贡献者编写了 58% 的提交
4.1/13.5贡献者广度 — 3 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled3
top_contributor_share0.581
评分方式
12.3/46.8议题解决 — 26% 的议题已关闭
38.2/38.3PR 接受 — 已裁定的 PR 中 12/12 已合并
0/15OpenSSF Scorecard:Code-Review — Found 1/23 approved changesets -- score normalized to 0
所用输入
merged_prs12
open_issues14
closed_issues5
issue_closed_ratio0.263
closed_unmerged_prs0
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
3.4/25所有者影响力 — Educentr 有 2 位关注者
13.6/25既往记录 — 18 个公开仓库,账户约 2 年
所用输入
followers2
owner_typeOrganization
is_verified
owner_loginEducentr
public_repos18
account_age_days792
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 4 天前
20/20版本历史 — 99 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/Educentr/go-project-starter
ecosystemsgo
any_deprecated
min_days_since_publish4

工程质量

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

77良好 · 占总体的 20%

工程实践

68中等
评分方式
24/24CI 工作流 — 4 个工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
20/20OpenSSF Scorecard:CI-Tests — 4 out of 4 merged PRs checked by a CI test -- score normalized to 10
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

90优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://educentr.github.io/go-project-starter/
10/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepagehttps://educentr.github.io/go-project-starter/
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 — 4 out of 4 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 1/23 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
0/2.5许可证 — license file not detected
7.5/7.5Maintained — 18 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — 无数据
0.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
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 — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 51 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3.1
已排除计分(无数据或不适用):packaging, signed_releases。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

81良好 · 占总体的 0%
评分方式
45/45代理指令 — CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 87 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.87
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes13,236
评分方式
18/18一条命令的引导启动 — Makefile
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — Dockerfile, lockfile
10/10已体现的代理实践 — 最近 100 次提交中有 82 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
1/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_filesMakefile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.82
toolchain_manifestsgo.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
55/55可控的文件大小 — 采样的 53 个源文件中有 0 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes56,778
source_files_sampled53
oversized_source_files0
评分方式
40/40API 模式(OpenAPI/GraphQL/proto) — example/admin.proto, example/example.proto, example/kafka_example.proto, test/docker-integration/configs/combined/item.proto, test/docker-integration/configs/grpc-only/item.proto
0/20MCP 服务器
40/40可运行示例 — example, examples
所用输入
example_dirsexample, examples
has_mcp_signal
api_schema_filesexample/admin.proto, example/example.proto, example/kafka_example.proto, test/docker-integration/configs/combined/item.proto, test/docker-integration/configs/grpc-only/item.proto

关键数据

3GitHub 星标
3贡献者
237最近 12 个月提交数
4距最近推送天数
67发布版本数
1巴士系数(bus factor)
14开放议题
Go软件包生态系统数

数据采集警告

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

更多细节

Star 与 Fork 历史 3 ★ / 1 ⇿
3Star
1Fork
28发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

01122333112025-102025-122026-01
主版本 0次版本 6修订 22
OpenSSF Scorecard 3.1 / 10
3.1综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-22 03:26 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests4 out of 4 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 1/23 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
0Licenselicense file not detected
10Maintained18 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10
不适用Packagingpackaging workflow not detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities51 existing vulnerabilities detected
直接依赖 11
注册表软件包版本约束清单文件
Gogithub.com/AlecAivazis/survey/v2v2.3.7go.mod
Gogithub.com/Educentr/goatv0.3.1go.mod
Gogithub.com/go-git/go-git/v5v5.11.0go.mod
Gogithub.com/pkg/errorsv0.9.1go.mod
Gogithub.com/spf13/pflagv1.0.5go.mod
Gogithub.com/spf13/viperv1.18.2go.mod
Gogithub.com/stretchr/testifyv1.11.1go.mod
Gogithub.com/testcontainers/testcontainers-gov0.40.0go.mod
Gogolang.org/x/modv0.28.0go.mod
Gogolang.org/x/textv0.30.0go.mod
Gogopkg.in/yaml.v3v3.0.1go.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": 2150,
      "has_wiki": true,
      "homepage": "https://educentr.github.io/go-project-starter/",
      "languages": {
        "Go": 625687,
        "Shell": 8730,
        "Makefile": 6850,
        "Dockerfile": 1485,
        "Go Template": 341586
      },
      "pushed_at": "2026-07-17T11:29:24Z",
      "created_at": "2025-10-01T04:33:13Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-17T11:22:39Z",
      "description": "Fast and easy start you go project",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": null,
      "default_branch": "main",
      "license_spdx_raw": null,
      "primary_language": "Go",
      "significant_languages": [
        "Go",
        "Go Template"
      ]
    },
    "owner": {
      "blog": null,
      "name": "Educentr",
      "type": "Organization",
      "login": "Educentr",
      "company": null,
      "location": null,
      "followers": 2,
      "avatar_url": "https://avatars.githubusercontent.com/u/170362089?v=4",
      "created_at": "2024-05-20T18:43:49Z",
      "is_verified": null,
      "public_repos": 18,
      "account_age_days": 792
    },
    "license": {
      "state": "absent",
      "spdx_id": null,
      "raw_spdx": null,
      "file_present": false,
      "scorecard_found": false,
      "profile_has_license": false
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.26.1",
          "kind": "patch",
          "published_at": "2026-07-17T11:29:37Z"
        },
        {
          "tag": "v0.26.0",
          "kind": "minor",
          "published_at": "2026-05-29T16:16:39Z"
        },
        {
          "tag": "v0.25.1",
          "kind": "patch",
          "published_at": "2026-05-25T17:05:57Z"
        },
        {
          "tag": "v0.25.0",
          "kind": "minor",
          "published_at": "2026-05-25T14:57:26Z"
        },
        {
          "tag": "v0.24.1",
          "kind": "patch",
          "published_at": "2026-05-14T16:58:53Z"
        },
        {
          "tag": "v0.24.0",
          "kind": "minor",
          "published_at": "2026-05-03T08:52:31Z"
        },
        {
          "tag": "v0.23.1",
          "kind": "patch",
          "published_at": "2026-05-02T15:53:40Z"
        },
        {
          "tag": "v0.23.0",
          "kind": "minor",
          "published_at": "2026-04-14T11:35:07Z"
        },
        {
          "tag": "v0.22.1",
          "kind": "patch",
          "published_at": "2026-04-13T18:16:35Z"
        },
        {
          "tag": "v0.22.0",
          "kind": "minor",
          "published_at": "2026-03-23T17:34:33Z"
        },
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-03-15T20:10:44Z"
        },
        {
          "tag": "v0.20.3",
          "kind": "patch",
          "published_at": "2026-03-15T18:26:13Z"
        },
        {
          "tag": "v0.20.2",
          "kind": "patch",
          "published_at": "2026-03-13T20:58:03Z"
        },
        {
          "tag": "v0.20.1",
          "kind": "patch",
          "published_at": "2026-03-10T23:49:03Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-03-03T11:47:38Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-03-03T11:18:51Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-03-01T15:43:22Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-02-28T20:16:48Z"
        },
        {
          "tag": "v0.16.0",
          "kind": "minor",
          "published_at": "2026-02-25T06:57:33Z"
        },
        {
          "tag": "v0.15.1",
          "kind": "patch",
          "published_at": "2026-02-20T23:33:25Z"
        },
        {
          "tag": "v0.15.0",
          "kind": "minor",
          "published_at": "2026-02-20T22:38:09Z"
        },
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-02-19T01:30:29Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-02-18T17:37:40Z"
        },
        {
          "tag": "v0.12.3",
          "kind": "patch",
          "published_at": "2026-02-18T00:39:35Z"
        },
        {
          "tag": "v0.12.2",
          "kind": "patch",
          "published_at": "2026-02-10T17:21:08Z"
        },
        {
          "tag": "v0.12.1",
          "kind": "patch",
          "published_at": "2026-02-05T23:05:39Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-02-04T22:06:25Z"
        },
        {
          "tag": "v0.11.7",
          "kind": "patch",
          "published_at": "2026-02-03T11:20:04Z"
        },
        {
          "tag": "v0.11.6",
          "kind": "patch",
          "published_at": "2026-02-03T10:45:40Z"
        },
        {
          "tag": "v0.11.5",
          "kind": "patch",
          "published_at": "2026-02-03T09:18:49Z"
        },
        {
          "tag": "v0.11.4",
          "kind": "patch",
          "published_at": "2026-01-28T19:05:18Z"
        },
        {
          "tag": "v0.11.3",
          "kind": "patch",
          "published_at": "2026-01-28T13:21:13Z"
        },
        {
          "tag": "v0.11.2",
          "kind": "patch",
          "published_at": "2026-01-27T12:47:44Z"
        },
        {
          "tag": "v0.11.1",
          "kind": "patch",
          "published_at": "2026-01-23T01:21:29Z"
        },
        {
          "tag": "v0.11.0",
          "kind": "minor",
          "published_at": "2026-01-21T00:02:45Z"
        },
        {
          "tag": "v0.10.0",
          "kind": "minor",
          "published_at": "2026-01-20T11:25:21Z"
        },
        {
          "tag": "v0.9.3",
          "kind": "patch",
          "published_at": "2026-01-20T01:41:22Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2026-01-20T00:24:20Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2026-01-15T12:57:41Z"
        },
        {
          "tag": "v0.6.2",
          "kind": "patch",
          "published_at": "2026-01-14T17:14:24Z"
        },
        {
          "tag": "v0.6.1",
          "kind": "patch",
          "published_at": "2026-01-13T12:47:58Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-01-13T07:05:23Z"
        },
        {
          "tag": "v0.5.17",
          "kind": "patch",
          "published_at": "2025-12-25T13:34:21Z"
        },
        {
          "tag": "v0.5.16",
          "kind": "patch",
          "published_at": "2025-12-24T18:39:17Z"
        },
        {
          "tag": "v0.5.14",
          "kind": "patch",
          "published_at": "2025-12-22T18:41:42Z"
        },
        {
          "tag": "v0.5.13",
          "kind": "patch",
          "published_at": "2025-12-22T15:17:26Z"
        },
        {
          "tag": "v0.5.11",
          "kind": "patch",
          "published_at": "2025-12-19T12:22:07Z"
        },
        {
          "tag": "v0.5.7",
          "kind": "patch",
          "published_at": "2025-12-15T19:37:11Z"
        },
        {
          "tag": "v0.5.2",
          "kind": "patch",
          "published_at": "2025-12-12T14:23:39Z"
        },
        {
          "tag": "v0.5.1",
          "kind": "patch",
          "published_at": "2025-12-10T20:56:59Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2025-12-10T08:38:07Z"
        },
        {
          "tag": "v0.4.2",
          "kind": "patch",
          "published_at": "2025-12-08T18:30:31Z"
        },
        {
          "tag": "v0.4.1",
          "kind": "patch",
          "published_at": "2025-12-08T17:28:40Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2025-12-05T10:41:40Z"
        },
        {
          "tag": "v0.3.3",
          "kind": "patch",
          "published_at": "2025-12-04T15:32:27Z"
        },
        {
          "tag": "v0.3.2",
          "kind": "patch",
          "published_at": "2025-12-04T10:27:37Z"
        },
        {
          "tag": "v0.3.1",
          "kind": "patch",
          "published_at": "2025-12-03T15:28:15Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2025-12-02T02:10:03Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2025-11-30T01:31:44Z"
        },
        {
          "tag": "v0.1.20",
          "kind": "patch",
          "published_at": "2025-11-21T14:00:44Z"
        },
        {
          "tag": "v0.1.19",
          "kind": "patch",
          "published_at": "2025-11-21T11:18:04Z"
        },
        {
          "tag": "v0.1.18",
          "kind": "patch",
          "published_at": "2025-11-14T16:27:43Z"
        },
        {
          "tag": "v0.1.15",
          "kind": "patch",
          "published_at": "2025-11-12T07:59:18Z"
        },
        {
          "tag": "v0.1.12",
          "kind": "patch",
          "published_at": "2025-11-11T19:49:20Z"
        },
        {
          "tag": "v0.1.9",
          "kind": "patch",
          "published_at": "2025-11-06T09:46:32Z"
        },
        {
          "tag": "v0.1.7",
          "kind": "patch",
          "published_at": "2025-11-03T16:33:48Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2025-10-15T09:30:16Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "a4788e22c2710830649ab5571c43a3295821ee85",
          "body": "fix(makefile): repair covdata guard, use compose v2, run argen via go run",
          "is_bot": false,
          "headline": "Merge pull request #31 from Educentr/fix/makefile-covdata-compose-argen",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-07-17T11:22:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5e31d04399c37324b0890e63647d903aec7bf77",
          "body": "… run\n\nFixes three independent defects in the generated Makefile (#30):\n\n1. The covdata preflight check used `go tool covdata help`, but covdata has\n   no `help` selector — it exits 2 with \"missing command selector\" even on a\n   full toolchain. The negated probe was therefore always true, so the\n   \n[…]\nhich prescribed the broken\n`go tool <X> help` probe as the recommended preflight check — the template\nwas just its first consumer.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(makefile): repair covdata guard, use compose v2, run argen via go…",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-07-17T09:17:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09e1835fed12e748366b77f46a0724b48fcb6586",
          "body": "Feat/static file transport",
          "is_bot": false,
          "headline": "Merge pull request #26 from Educentr/feat/static-file-transport",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-29T16:13:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "198f521740bd1a2630175fe5ae1de127390e3f64",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: ignore .codegraph/ and .cursor/",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-29T16:05:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "645301dc5ce699c25f20f7868307845470eeae0c",
          "body": "Add a new REST template transport (generator_type: template,\ngenerator_template: static) that serves files from a project folder over\nHTTP without any authorization, at /static/<path>.\n\n- Own no-auth HTTP server (mw.EmptyMiddlewares), like sys, on its own port\n- Files served from filesystem via http\n[…]\nore paths\n- Docs, example, and tests (Rest.IsValid, HasStaticTransport/StaticDirs,\n  TestGenerateStaticTransport + configs/static)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(transport): add static file server template transport",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-29T16:04:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4714ca3112f57f57ad56683a9d974bf4d9481966",
          "body": "Two unrelated post-v0.25.0 failures surfaced in the same CI run:\n\n1. golang.org/x/tools@v0.43.0+ requires Go 1.25.0, so the\n   `goimports@latest` install in `test/docker-integration/Dockerfile`\n   and the generated `Makefile.tmpl` started failing on the Go 1.24\n   baseline. Pin both to v0.42.0 (the \n[…]\nred-spec test sets {svc_a_v1:8081, svc_b_v1:8082, sys_v1:8085}.\n   Env vars are emitted in sorted key order for reproducible logs.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: pin goimports and support per-test REST port envs",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-25T16:57:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bc0d3e6736688e1c1dc693ab9879349b01aa9424",
          "body": "protoc-gen-go-grpc@v1.6.2 (released 2026-05-07) bumped the required Go\nversion to 1.25.0. Two install sites used `@latest` and started failing\nafter that release:\n\n  * test/docker-integration/Dockerfile — base image `golang:1.24-bookworm`,\n    breaking the Integration Tests workflow on every push si\n[…]\n to v1.6.1, the last release compatible with Go 1.24. This\nmatches what `@latest` resolved to during the most recent green CI run.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: pin protoc-gen-go-grpc to v1.6.1 for Go 1.24 compatibility",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-25T16:41:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dcce178ceb88d974550517f6d56be7903906d6a8",
          "body": null,
          "is_bot": false,
          "headline": "fix copy ref",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-25T16:09:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "557ced3d15262f714e3f505a3651739eedd99cf8",
          "body": "Cross-directory $ref values (e.g. `../common/foo.yml#/X`) in OpenAPI /\nJSON Schema specs break after CopySpecs / CopySchemas because the\ngenerator flattens every input into one target directory. Until now\nconsumers worked around this with hand-rolled post-processing scripts.\n\nAdd `rewrite_refs: true\n[…]\nve\n$ref between them) and asserts both that the rewritten value appears and\nthat the original ../common/ path is gone after regen.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(refrewrite): opt-in $ref rewriter for cross-directory specs",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-25T14:49:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c75fb3545bceb56c8241fa7934cd6f9711274c65",
          "body": "Multiple defenses against the auto-toolchain regression class that\ncaused the 1.26.1 bump to silently break integration coverage:\n\n1. Makefile.tmpl: gate `go tool covdata textfmt` in goat-tests behind\n   a preflight `go tool covdata help` check. When covdata is missing\n   (auto-downloaded toolchain \n[…]\ny itself.\n\ngenerator.go: extend `executable_scripts` post-generate step to chmod\nthe new check script alongside goversioncheck.sh.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: harden Go version policy with covdata fallback and CI check",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-05-14T16:57:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "695271b21f7a05f286323b0672fdbbed08f0e8e6",
          "body": "Revert cosmetic Go version bump from e79f163 (go.mod 1.24.4 → 1.26.1,\ndefault golang_version 1.24 → 1.26, plus mirror updates in Dockerfile,\nCI workflow, docs and all test configs). The bump introduced no\nGo-1.26-specific features; max required by direct deps is still 1.24.0\n(github.com/testcontaine\n[…]\nner image to be built via make integration-test, so including\nthem in the default test target made make test fail unconditionally.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: revert Go 1.26.1 bump and exclude docker-integration from make test",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-05-14T16:56:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fe0c8b63104b2f37706cf701f6ebf58a8e908d6a",
          "body": "Update default golangci_version from 1.x to 2.1.6 in config defaults,\ninit, example, all test configs, and LLMS template. The Makefile template\nalready used v2 import path but with v1 tag, causing install-lint to fail.\nAdd TestGolangciLintV2Consistency to prevent regression.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: use golangci-lint v2 version with v2 import path (fixes #16)",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-05-14T15:43:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4abd06003475ceeab8cb22efaa7d0183010ea15f",
          "body": "feat(specsource): support remote spec sources in path: (git, https)",
          "is_bot": false,
          "headline": "Merge pull request #22 from Educentr/feat/remote-specs",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-03T08:50:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f57d866342f4f7e874b505c3f396f567a44b0dd",
          "body": "Previously CLI commands.yaml (cli.path) and queue worker contracts\n(worker.path for generator_template: queue) only accepted local file\npaths — they're parsed inline during config load, before the main\nresolveAllSources pre-pass that handles REST/gRPC/JSONSchema sources.\n\nAdds a resolveInlineSpec he\n[…]\necs.md, troubleshooting.md, and CLAUDE.md; expanded the\n\"supported sources\" matrix to call out the inline-vs-pre-pass\ndistinction.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(specsource): support remote URIs for CLI and queue worker specs",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-02T18:25:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "684944af13492317abcd920b68a1541c1f5ad253",
          "body": "Adds two GOAT-based docker-integration scenarios that exercise the full\ngenerate → make generate → go mod tidy → go build → docker run pipeline\nwith remote spec sources. The fixtures point at example/example.swagger.yml\nin this same public repository (Educentr/go-project-starter @ main), so\nthe test\n[…]\niner,\nwait for /ready) — they exercise the same realistic pipeline as the\nexisting rest-only test, just with a remote spec source.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(specsource): docker-integration tests for remote spec sources",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-02T17:53:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09e258ec5b60107646da7dbcf8b7536511381367",
          "body": "Run the real `go-project-starter` binary against synthetic project.yaml\nconfigs and assert observable behaviour. Uses httptest.NewServer for\ndeterministic HTTP scenarios — no external network dependencies, no\nbuild tags, runs as part of `go test ./test/`.\n\nCoverage:\n  - HTTP download lands at api/re\n[…]\nlocal ./relative.yaml regression: copied byte-for-byte as before\n  - staging directory under TMPDIR is cleaned up after Generate()\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(specsource): add 10 end-to-end integration tests for remote specs",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-02T17:49:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a933b989ac06cd761b9012d7331af73d86c69c4f",
          "body": "Adds a new `internal/pkg/specsource/` package that parses `path:` entries\nin project.yaml as URIs and materializes them under a per-run staging dir\nduring a pre-pass before CopySpecs/CopySchemas. Backward-compatible:\nanything without `://` continues to be treated as a local path.\n\nURI grammar:\n  - .\n[…]\n\n\nDocs: docs/configuration/remote-specs.md (new), short pointers in\ntransports.md, regeneration.md, troubleshooting.md, CLAUDE.md.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(specsource): support remote spec sources in path: (git, https)",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-02T17:34:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "41b5d7bab23ffdfc109233184e7076a3286b3839",
          "body": "Заменили `Capitalize` (cases.Title, сохраняет дефис) на `CapitalizeFirst`\n(делит по `-`/`_` и склеивает PascalCase) для `.ProjectName` в\nшаблонах tests/files/. Без этого проекты с дефисом в main.name\n(например, virtualit-runtime) генерировали невалидный Go-код вида\n`Virtualit-RuntimeConfig`, ломая б\n[…]\ntest\n- CLAUDE.md — раздел Regeneration Behavior с правилом про disclaimer\n  marker в env-файлах (ручные блоки только ниже маркера)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: hyphen-safe identifiers in goat-tests templates",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-05-02T15:52:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6bcf4f823e8e338301451f3dc33e307ccaec4ef5",
          "body": "ErrorTimeout and NewCycleTimeout in the generated daemon worker are now\noverridable via WORKER_{NAME}_ERROR_TIMEOUT and WORKER_{NAME}_NEW_CYCLE_TIMEOUT\nenv vars. Defaults stay at 10s. Lets goat tests speed up the supervisor loop\nwithout having to wait for the hard-coded 10s NewCycleTimeout between GetTasks\nchecks.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: allow overriding daemon worker loop timers via env vars",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-04-14T11:32:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f4f55609192022c8caf82cb94f7b92a22cfa152e",
          "body": "Env-based apps don't rely on OnlineConf for test env vars, so the\ngenerated Makefile no longer emits onlineconf-update-tests or\ngenerate-test-env-<app> for them. Also fix traefik entryPoints\ncasing in compose templates.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: skip onlineconf bootstrap for goat tests when use_envs=true",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-04-13T18:14:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "38a90ba756ef30529471202e864cb557bdd9c664",
          "body": "When generating a telegram bot, automatically create a /start command\nwith a welcome handler, so every bot has a working entry point out of\nthe box.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: generate /start command and handler for telegram bot",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-03-23T17:33:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e79f163ca9da3bd7635c73141b7fb8003211b6ef",
          "body": null,
          "is_bot": false,
          "headline": "go to golang 1.26.1",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-03-15T20:10:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a9a46309ecebb9fac169d2aafc2a548b55d0c935",
          "body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add main.ci field documentation",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-03-15T18:28:31Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "db3a0de343ea7f092e40fae5394d58dd4d43be7d",
          "body": "When ci field is explicitly set to empty array in project.yaml,\nno CI files (.github/workflows/ci_cd.yml, .gitlab-ci.yml) are generated.\nOmitting ci field still generates both (backward compatible).\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: support ci: [] to disable all CI file generation",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-03-15T18:08:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cc9eb32e7537806ad841d290da1c9a9c660903af",
          "body": null,
          "is_bot": false,
          "headline": "update defaultOgenVersion",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-03-13T20:51:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "abdd5a84058b34306082f47786a8da24f1c5fc50",
          "body": null,
          "is_bot": false,
          "headline": "add goat tests for more then on application",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-03-10T23:47:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91a9fb8cc0719927f06bf9a12637969c2427d07f",
          "body": null,
          "is_bot": false,
          "headline": "fix goat tests",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-03-05T13:44:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0eada9bf58c12ec7522324dc3a6302c337f19c2",
          "body": "fix: generate telegram files only when telegram worker is configured",
          "is_bot": false,
          "headline": "Merge pull request #18 from Educentr/shared_telegram",
          "author_name": "Nikolai",
          "author_login": "Nikolo",
          "committed_at": "2026-03-03T11:41:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e89d36e33b9bec1a800dad992bc9ac3a36ccf9cb",
          "body": "…r-marker workaround\n\nDocument required ErrorDefault schema for ogen-based REST generation,\nadd troubleshooting section for ogen compilation errors, and describe\nafter-marker code as a workaround pattern for open issues.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add ErrorDefault schema requirements, troubleshooting, and afte…",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-03-03T11:18:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "67721707ce89539ac0b0df123027bcad5e3ea01f",
          "body": "Move COMMIT_MSG to env block in ci_cd.yml template to prevent bash\nfrom interpreting newlines in multiline commit messages (fixes #19).\nUpdate TestGenerateRESTLogrus and TestGenerateRESTTimeouts to reflect\nREST server/mw files moved to runtime.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: CI multiline commit message and update tests for runtime migration",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-03-03T11:18:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "09845098840c6715b949a8883a522c2c0646c522",
          "body": null,
          "is_bot": false,
          "headline": "add ErrNotImplemented",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-03-02T15:01:07Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cccb723b51e2e0c841d77ea49ea1fbf091031fde",
          "body": null,
          "is_bot": false,
          "headline": "update docs menu",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-03-01T16:24:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c803e2583827b0d83b5577033368d038da5acc0e",
          "body": null,
          "is_bot": false,
          "headline": "update Makefile template",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-03-01T15:40:28Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce03f41d9ab66da0b77c81c4e9902cef44ed34ab",
          "body": "When generate_llms_md is enabled, the generator now checks the target\ndirectory: if no CLAUDE.md exists, it generates CLAUDE.md (auto-read by\nClaude Code); if the user already has their own CLAUDE.md, it falls back\nto LLMS.md. On regeneration, the previously chosen filename is preserved.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: prefer CLAUDE.md over LLMS.md for AI agent documentation",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-03-01T15:34:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7bd65be5a6edcedc8f216ca8e921911d8c2217bf",
          "body": "Add two new sections to help AI coding agents working on generated projects:\n- Generator Configuration Reference: full annotated YAML example with all\n  config sections and key validation rules\n- Structural Changes Workflow: 10 step-by-step recipes for common operations\n  (adding transports, workers, Kafka, drivers, applications, etc.)\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: expand LLMS.md template with config reference and workflow guide",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-02-28T20:15:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "092425a646619b0e272f92ae9855f1f36aba0c57",
          "body": "Move telegram and daemon shared templates from worker/files/ (loaded\nunconditionally for all workers) to worker/template/<type>/shared/\n(loaded only when the corresponding worker template is configured).\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: generate telegram files only when telegram worker is configured",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-02-28T17:41:03Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2f877e6ba888645a6a2f89f60c98262f3f8b1349",
          "body": "The rest-logrus config directory was missing from the hardcoded\nconfigDirs list in setupContainer, causing TestIntegrationRESTLogrus\nto fail with \"cannot stat '/workspace/test-configs/rest-logrus/.'\".\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add rest-logrus to integration test config dirs",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-02-25T07:24:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8c278866b0fb35a801489b40b9d2e6eeb4834499",
          "body": "Add `generate_llms_md` config option that generates a project-specific\nLLMS.md file with architecture rules, code placement guide, build\ncommands, and OnlineConf paths. The file is generated once and never\noverwritten on regeneration (like README.md). Includes dynamic sections\nfor ActiveRecord, REST, gRPC, Workers, Kafka, DevStand, and GOAT tests.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add LLMS.md generation for AI coding agents",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-02-25T06:51:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e36cf5ec5e4e55fe64b88ebc11bfa90c910bb99e",
          "body": "Stale psg_*_gen.go files (e.g. from pkg/app/rest/mw/) remained on disk\nafter templates were moved to runtime, causing build errors like\n\"undefined: reqctx.CreateContext\". The generator now detects files with\ndisclaimer markers that are no longer in the template set and removes\nthem automatically. Files with user code below the disclaimer block\ndeletion with an error.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: auto-delete obsolete generated files on regeneration",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-20T23:33:10Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e39eb623cd0a7f996347e0eed761d008e638115d",
          "body": "…rker templates\n\nMove REST server, middleware, and event logger templates to go-project-starter-runtime.\nGenerated projects now import these packages directly instead of containing copies.\n\nChanges:\n- Delete 16 REST template files (server, handler, closer, middleware, tests)\n- Add restconfig/config_\n[…]\nt logger methods for zerolog and logrus\n- Add worker graceful shutdown support (OnGracefulStop, OnShutdown)\n- Bump MinRuntimeVersion to v0.15.0\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: move REST infrastructure to runtime, refactor restconfig and wo…",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-20T22:37:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "997e4536e90ac19925c0cbefe7635dfb55b8eeae",
          "body": "Queue processing system added in runtime v0.14.0.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump MinRuntimeVersion to v0.14.0",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-19T21:05:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e65fc91f064a703f3732468e72b0c2268b22ecf9",
          "body": "Add queue processing support to the code generator:\n- YAML queue contract parser with validation (unique IDs/names, field types)\n- DS types: QueueField, QueueDef, QueueConfig integrated into Worker struct\n- Generator loads queue contracts and converts to typed config\n- 5 templates: typed task struct\n[…]\nlization code generation\n- Fix TestGenerateRESTTimeouts assertions to match current template output\n- Integration test: TestGenerateQueueWorker\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add queue worker code generation from YAML contracts",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-19T20:40:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "83267b7235611f9f5254f3657222f154308f72c5",
          "body": "- Add import alias (cliName) for CLI handler package in generated main (fixes #10)\n- Use ds.IService instead of *service.Service in CLI handler template (fixes #11)\n- Import ds from runtime package, not project-local path (fixes #11 follow-up)\n- Use -H flag for mc alias set/mirror behind nginx basic auth proxy\n- Add regression tests for all three issues\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: CLI handler import alias and ds.IService type mismatch",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-19T15:54:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "cce6d2699e5f1fca39053b5e47d8fad89c569ca5",
          "body": "Add CLI command specification support analogous to ogen's OpenAPI generation.\nUsers define commands, subcommands, and typed flags in commands.yaml, and\nthe generator produces Params structs, UnimplementedCLI stubs, flag parsing,\nand subcommand dispatch — allowing projects to compile immediately and\noverride specific command handlers in separate files.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: generate CLI handlers from YAML spec (commands.yaml)",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-19T01:29:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c292770149ef7d257819b2cc8e955909172b43c8",
          "body": "…ucture\n\n- Add atomic timeout fields + graceful server restart when OnlineConf\n  timeouts change (instead of writing to http.Server fields unsafely)\n- Fix OC key paths: timeout/* → server/timeout/* to correctly represent\n  http.Server config namespace within transport\n- Remove defaultHandlerTimeout fallback (return 0 = no timeout if unconfigured)\n- Add server_test.go.tmpl with race, enforcement, and graceful restart tests\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: REST server graceful restart on timeout changes, fix OC key str…",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T23:52:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d4623968330061f98e84f8d86756948ae3d76d4c",
          "body": "mc alias set does not support --api-header. Move custom headers to\nmc mirror --header flag instead. Add ToGitHubSecret template function\nto convert ${VAR} references to ${{ secrets.VAR }} in GitHub Actions.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: split mc alias/mirror and add ToGitHubSecret for header vars",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T19:35:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "61f0060a35d297be8e3a12b1918f600d7214fc0a",
          "body": "Add new `minio` documentation type that uses native MinIO Client (mc)\ninstead of aws s3 sync, with support for custom HTTP headers via\n--api-header flag for reverse proxy scenarios.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add minio documentation deployment type with mc client",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T19:19:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "21ad9f6c7fa00c0a1327b3f48da2934996deec67",
          "body": "…MinIO compat\n\nThe aws-actions/configure-aws-credentials@v4 action validates tokens\nvia AWS STS, which fails with MinIO. Set AWS_ACCESS_KEY_ID,\nAWS_SECRET_ACCESS_KEY, and AWS_DEFAULT_REGION as env vars directly\non the deploy step instead.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: replace aws-actions/configure-aws-credentials with env vars for …",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T18:04:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ad9aa177ff2ee2803f9f21b51e620a7c4869bf89",
          "body": "…n CI\n\nGitHub Actions: add github.ref == 'refs/heads/main' condition to\ndeploy-docs job, replace pip/python with squidfunk/mkdocs-material\nDocker image. GitLab CI: replace python:3-slim image with\nsquidfunk/mkdocs-material. Fix S3 docs prefix to use project name\nwithout extra docs/ nesting.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: restrict docs deployment to main branch, use Docker for mkdocs i…",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T16:23:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4213a29bce3e5b37f88dfb45ebbcd97783138586",
          "body": "Remove EmptyConfigAvailable field from Rest and Grpc config structs,\nbackward-compat conversion in generator, deprecation checks in migrate,\nand related test cases. Update DEPRECATION.md.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove deprecated empty_config_available (removal version 0.13.0)",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T11:49:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b8059b1aca6a8cbd95a7c4a5ac0aab40e952fce1",
          "body": "Add `ci` field to main config (github/gitlab/both). When specified,\nonly selected CI templates are generated. Empty = both (backward compat).\n\nSwitch generated docs targets to Docker (squidfunk/mkdocs-material)\ninstead of requiring local Python/pip. Simplify S3 docs prefix to\njust SERVICE_NAME since the bucket is docs-only.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add configurable CI provider selection and use Docker for docs",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T11:38:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "237ccd5b15cb8e82906e5e0adfbd658f1d53d4ea",
          "body": "Replace hardcoded AppInfo with version/commit/buildDate variables\ninjected via ldflags. Define LD_FLAGS in Makefile, rename BIN_NAME\nto go-project-starter, add ldflags to buildfortest target.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add CLI version command with ldflags-based build info",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T01:26:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b02829cb33b061470a7caeb0e278cb7a2062dfda",
          "body": "Update runtime dependency to v0.13.0 which adds CreateContextWithTimeout\nfor explicit timeout control in request context creation.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump MinRuntimeVersion to v0.13.0",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T00:38:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ad601d6b8314ee93eed72a10d0aff42083041be1",
          "body": "Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add daemon worker to worker-daemon integration test config",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T00:38:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "51aa417a5c85e8058882f6c1a319b4f24c200b70",
          "body": "Generate MkDocs Material setup with CI/CD deployment for S3 or GitHub Pages\nwhen `documentation` section is present in project config. Includes mkdocs.yml,\ndocs/index.md, Makefile targets (docs-build/serve/deploy), and deploy-docs\njobs for both GitHub Actions and GitLab CI.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add documentation deployment generation (MkDocs + S3/GitHub Pages)",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T00:38:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "587cf5c2f5bb56dd94591a060e70fba1b408f884",
          "body": "Replace single timeout with split read/write/handler timeouts for REST servers.\nAdd dynamic timeout updates via OnlineConf subscriptions, handler timeout\n3-level fallback with write timeout clamping, and timeout exceeded logging\nin metrics middleware. Include generator and runtime tests.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: implement split REST server timeouts with handler timeout logging",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-18T00:38:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8cdb2456cb47ca4549f2d6cc53730e1905e88c07",
          "body": "Combine r.Method and r.URL.Path into a pathKey (e.g., GET_payment__token)\nfor OnlineConf path resolution, allowing separate config per method+path.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: include HTTP method in OnlineConf request context key",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-02-16T12:59:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "aceab850c6a0b30572fca0a72ac3eafbe215d49b",
          "body": "Without --schema_path, make generate-argen only regenerated Go code\nin cmpl/ but not the DDL schema.sql. Adding --schema_path etc/database\nensures both Go code and database schema are generated together.\n\nCo-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add --schema_path to argen generate command in Makefile template",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-10T17:15:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5aa97c3ef19fabda9a79e05f62be7ac3254fb2f1",
          "body": "- Add unit tests for internal packages: loggers (100%), config (44%),\n  ds (60%), migrate (76%), templater (30%), generator (3%)\n- Add unit test templates for generated projects:\n  - REST middleware tests (auth, common, csrf)\n  - REST client tests (RoundTripper, Chain)\n  - Telegram worker tests (par\n[…]\n\n  - Constant package tests\n- Update default argen version to v3.1.22\n- Add deprecation comment for empty_config_available (removal in v0.13.0)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add unit tests for generator and generated projects",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-05T23:05:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5ab9c810fe08140d8c3a6b41b5839127e8a72fcb",
          "body": "BREAKING: Transport entries in applications must now use object format:\n  transport:\n    - name: api\nInstead of the deprecated string format:\n  transport:\n    - api\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: remove deprecated transport string array format (v0.12.0)",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-04T21:10:43Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8c4db2ecc7d33f35b75ccdfdb68f2bc5da4a35e7",
          "body": "Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update documentation for logrus logger support",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-04T21:01:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "72dccaab085104ce61fe21290baf985852205e78",
          "body": "Add TestGenerateRESTLogrus unit test that verifies logrus project\ngeneration produces correct files with rlog imports and InitLogrus.\nAdd rest-logrus docker-integration test config and TestIntegrationRESTLogrus.\nExtract shared constants (paramParts, errParam, nilErr, destDir) into\nloggers.go to satisfy goconst linter across both logger implementations.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add logrus generation tests, fix lint issues",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-04T18:37:45Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "83bfb784e6d9467b2f876ae8c14411e59507a9e7",
          "body": "Use `rlog` alias for runtime logger in logrus code generation (mirrors\nzerolog's `zlog` pattern) to avoid name collisions with the project's\nown `logger` package. Make runtime logger imports conditional in\ntemplates that already have them hardcoded. Add runtime/strconv imports\nfor ErrorMsgCaller in ogen handler template.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: resolve logrus import conflicts, bump MinRuntimeVersion to v0.12.0",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-04T18:04:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fc9a960c858597099d3bdbac645298672e8595fb",
          "body": "- Add LogrusLogger struct with all Logger interface methods\n- Register logrus in LoggerMapping\n- Move zlog.go.tmpl from main/ to logger/zlog/ for proper template selection\n- Create logrus.go.tmpl init template with JSON/Text formatter support\n- Update ZlogLogger.DestDir to pkg/app/logger\n- Update ZlogLogger.ReWrap to use generic logger.ReWrap\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add LogrusLogger implementation and logrus init template",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-04T09:24:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "fd75002075bdfa703bc2216a78dfc2194f0eb19c",
          "body": "…rpolation\n\n- Add SubContext to Logger interface for creating derived loggers\n  without mutating the parent (used in kafka producer async worker)\n- Skip .Err(nil) in ErrorMsg/ErrorMsgCaller when err is \"nil\"\n- Use printf for template variables in Logger method arguments\n  (nested {{ }} inside {{ }} are not processed by Go templates)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add SubContext method, skip Err(nil), fix template variable inte…",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-04T08:04:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5204be6556b4c12ffcb1b503b831d11c7c1e34c1",
          "body": "Replace all direct zerolog calls (zlog.Ctx) in 18 template files with\nLogger interface methods. Migrate all zerolog-specific params (Str, Int,\nInterface, Err) to universal type::key::value format. Add ErrorMsgCaller\nand SetupTestLogger methods to Logger interface.\n\nKey changes:\n- Fix err injection h\n[…]\nto context.Context\n- Replace all hardcoded zerolog imports with {{ .Logger.Import }}\n- Zero behavioral change: zerolog output remains identical\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: migrate templates to universal type::key::value param format",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-03T20:23:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bea759f7a89cdd7cc7f62a367e27095c806b96bb",
          "body": null,
          "is_bot": false,
          "headline": "update CLAUDE.md",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-02-03T11:21:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5bfca23fbc5fea354ccc67f727d6d70af9873284",
          "body": null,
          "is_bot": false,
          "headline": "add bearer token",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-02-03T11:03:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12000fba2df156651c8fa2f39e73f49fea8be9c5",
          "body": "Support dynamic instantiation mode for gRPC buf_client, matching\nthe existing REST ogen_client pattern. Dynamic clients are not\nregistered at startup — users create them via NewDynamicClient(ctx, address).\n\nAlso includes:\n- Deprecate empty_config_available in favor of optional transport config\n- Rem\n[…]\nstruct (replaced by Optional)\n- Add deprecation warnings for empty_config_available usage\n- Migrate test configs to new transport object format\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add instantiation: dynamic for gRPC buf_client",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-03T10:45:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1b88b820eda0495819d2f91d1254eb714b2fb2c4",
          "body": "Clients with empty_config_available: true can legitimately be nil\nwhen host/port are not configured. Don't fail startup validation\nfor them.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: skip ValidateFor* check for empty_config_available clients",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-03T09:18:20Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8453de934464901493cc2703e90cd0dffa815fe8",
          "body": "- Support optional flag for drivers, kafka producers, and transports\n- Generate tryGet* methods only for optional dependencies\n- Remove accessor methods for required dependencies (fixes name collision)\n- Add ValidateFor* startup checks for required dependencies\n- Support both string[] and object[] format for kafka in app config\n- Add CapitalizeFirst template func, remove unused ToCamelCase\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add optional dependencies and startup validation",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-02-03T01:32:22Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ac3279ede239569bf93c1a1419a75d7f032d1722",
          "body": "Replace general architecture mermaid diagram with layered view\nmatching the reference design (Transport → Service → Data).\nRemove duplicate \"Связь компонентов\" section.\nAdd `make docs` target for running mkdocs locally in Docker.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: update architecture diagram and add make docs command",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-30T13:29:26Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "775ebd7cc09738b27db12de77eb03eca183eac99",
          "body": "- Add \"Why Go Project Starter?\" section with monolith vs microservices problem\n- Explain monorepo approach for gradual decomposition\n- Add Spec-First approach documentation\n- Document Service as the core business logic component\n- Add transport types comparison (API, Workers, Bots, CLI)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add philosophy and architecture details from audio notes",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-29T12:49:23Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "091bd3c80ec00b25876fe48bcdb6edbf737d4e71",
          "body": "Allows using @@SSH_HOST@@ in env files which gets replaced with\nthe actual deployment server IP/hostname during deploy stage.\n\nUseful when application needs to know its external IP for service\ndiscovery registration or callback URLs.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: add deploy-time placeholder @@SSH_HOST@@ for env files",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-28T19:04:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "96792f413659645dcc4533aaee4fa4fa7f8bc6d0",
          "body": "This ensures deb/rpm/apk packages contain statically compiled\nbinaries that work across different Linux environments.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: add CGO_ENABLED=0 to build targets for static binaries",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-28T13:20:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d807dbd7bad0b962da2a4680fe82795c3c616b34",
          "body": null,
          "is_bot": false,
          "headline": "fix make test",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-01-27T12:44:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1fa8938c221ab036418b3793957e86bcd396b254",
          "body": null,
          "is_bot": false,
          "headline": "update README.md",
          "author_name": "sklukin",
          "author_login": "sklukin",
          "committed_at": "2026-01-24T07:35:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8930b2f593bacef0c77a6601731437f66f742b04",
          "body": null,
          "is_bot": false,
          "headline": "fix: correct broken link in generator.md",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-23T02:27:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ece83722b224199874c543e1b7046f93a1c4b463",
          "body": "Template changes:\n- Add IsMessageDeleteError() for expected delete errors (48h limit, already deleted)\n- Add IsMessageEditError() for expected edit errors (no text, not modified)\n- Use Warn level for expected telegram errors instead of Error\n- Keep Error level only for unexpected failures\n\nRuntime:\n- Update MinRuntimeVersion to v0.11.1 (adds ActorWasSet field)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: improve telegram error handling and update runtime version",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-23T01:19:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4498390b81b474e19c7d2f02cc5f93ed746feb63",
          "body": "- Reorganize docs into modular structure (getting-started, architecture,\n  cli, configuration, workflow, examples, testing, reference)\n- Add mkdocs.yml with Material theme configuration\n- Add GitHub Actions workflow for auto-deploy to Pages\n- Move COMPARISON.md and CONTRIBUTING.md to project root\n- \n[…]\nments to structs.go for Worker, CLI, Grpc, Driver, JSONSchema\n- Update defaultGolangVersion to 1.24\n- Remove old monolithic documentation files\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: restructure documentation with MkDocs",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-23T00:40:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "92b81aa8f29236e7030370b05abf282996be7c36",
          "body": "…paths\n\n- AppInfo.AppName now uses Application.Name instead of ServiceName\n- Add transportName parameter to GetMiddlewares interface\n- Fix parameter order in GetMiddlewares call (appName, serviceName, transportName)\n- Fix OnlineConf paths to use 3-level hierarchy:\n  /{serviceName}/transport/rest/{tr\n[…]\n transportName.\nAppInfo.AppName now contains ApplicationName, not ServiceName.\nPrometheus metric names now include transport name as subsystem.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor: fix naming system for AppInfo, middlewares, and OnlineConf …",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T21:19:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3e8c5b09d0ed4f92e86fedb59dd8894cfe7d0d10",
          "body": "- Add step 3: GitHub Release creation\n- Emphasize: tag != release\n- Always diff between releases, not tags\n- Compose release notes relative to last release commit\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Update release checklist: GitHub release is mandatory",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T11:27:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9b5e7e5c53b4f95892da09bd00adb02382237140",
          "body": "Features:\n- Add instantiation: dynamic for ogen_client (per-REST or per-app level)\n- Generate NewDynamicClient() factory for runtime client creation\n- Add migrate command for automatic config migration\n- Add deprecation system with per-feature removal versions\n\nConfig changes:\n- Transport now suppor\n[…]\npatible: both formats work\n\nNew files:\n- internal/pkg/migrate/ - config migration utilities\n- DEPRECATION.md - deprecation policy documentation\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add dynamic client instantiation and config migration",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T11:14:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "17ad4d46f8d9f8d9e10f273aef3cc240f3c497b3",
          "body": "Deploy now waits for upload-packages to complete (when HasUpload is true).\nEnsures packages are uploaded before deployment starts.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add upload-packages dependency to deploy jobs",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T03:08:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1d05f5282a174fd3308cbe3d95afca38267c114e",
          "body": "Remove deployed/built distinction from notifications.\nNow shows simple lists: \"Docker образы:\" and \"Пакеты:\"\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Simplify notifications: show plain artifact lists",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T03:05:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b2438018c006b4b1613c221b4d50c6e78aa675b1",
          "body": "Package builds now wait for GOAT tests to complete before running.\nGitLab CI uses optional job dependencies, GitHub Actions uses\nconditional execution with result checks.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add GOAT test dependencies to build-packages job",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T02:45:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9199e6df84b7c81dc8fc5f5f2e7d574e1ded4348",
          "body": "nfpm doesn't support ${VAR:-default} syntax, only plain ${VAR}\nThe VERSION is always set by Makefile's PKG_VERSION\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix nfpm version: remove bash-style default syntax",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T02:32:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3934b54b28673728b7cd181732d58508d718eb60",
          "body": "- Docker images: \"Задеплоено\" when deploy runs, \"Собрано (не деплоится)\" otherwise\n- Packages (deb/rpm/apk): \"Собрано (установка вручную)\"\n- Updated both GitHub Actions and GitLab CI templates\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Split notifications into deployed vs built artifacts",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T02:31:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1bf0e15d17f31bba53e4fd8564a246d8eeec1b0a",
          "body": "- Add PKG_RELEASE to replace dashes with dots in RELEASE\n- main branch: YYYYMMDD.HHMM.commit (e.g., 20260120.0512.bb7b2ca4)\n- other branches: 0~devYYYYMMDD.HHMM.commit (sorts lower than releases)\n- Update package-list to use PKG_VERSION\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix PKG_VERSION to be deb-compatible",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T02:23:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3897a3abd40b3cd9c76a80483f5005570d5f6f45",
          "body": "- PKG_VERSION now uses DOCKER_TAG (date-commit format) instead of just RELEASE\n- package-list shows full package names with version like docker images\n- deb/rpm/apk targets now use per-app HasDeb()/HasRPM()/HasAPK() checks\n- packages target uses per-app artifact checks\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix package version and per-app artifact checks",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T02:09:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "517f20f3cd860dcf94d7d95fd3fe0f58d1a8a334",
          "body": "- Add PACKAGES output from make package-list\n- Move artifact_version job outside HasDocker block\n- Update notification to show both Docker images and deb/rpm/apk packages\n- artifact_version now depends on build and/or build-packages based on config\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix notifications to show both Docker images and packages",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T01:40:37Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e0adcabee39b92c244c2411ee2c1c9d2f680b2cb",
          "body": "- GitLab CI: Use minio/mc:latest image and mc commands\n- GitHub Actions: Install mc and use mc cp for uploads\n- Remove UPLOAD_REGION from MinIO (not needed for mc)\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Change MinIO upload to use mc client instead of aws cli",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T00:43:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "92fdd8004e2bffd7291c2b78db3967a0c46312a5",
          "body": "- Makefile: docker-list and artifact-list now only include apps with HasDocker()\n- Makefile: docker-* targets only generated for apps with docker artifacts\n- fs.go: Skip Dockerfile and docker-compose generation for non-docker apps\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix Docker artifact generation for per-app artifacts",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T00:41:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "035cf8e46de233ca72da477448a76ff728791979",
          "body": "Applications can now specify their own artifacts list, overriding the\nglobal configuration. When an application has artifacts: [deb], it will\nonly generate deb packages without Docker builds, and CI won't require\nDocker/TRAEFIK variables for that app.\n\n- Add Artifacts field to config.Application str\n[…]\nglobal\n- Fix artifact initialization order (before app processing loop)\n- Update CI templates to check per-app HasDocker() for each application\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add per-application artifacts support",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-20T00:23:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bada99152dfa0d2ea5f7b2b85f1c5d5784eddcb3",
          "body": "For projects without Docker artifacts (e.g., packaging-only with deb/rpm/apk),\nthe CI pipelines no longer require Docker registry credentials, traefik ports,\nor other Docker-specific variables.\n\nChanges:\n- GitLab CI: wrap variables, default image, prepare-env docker-list, goat-tests,\n  build-templat\n[…]\nin step, Upload env file step, create_env_files job, goat-tests\n  jobs, build job, deploy job, and artifact_version job in HasDocker conditions\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Make Docker-specific CI sections conditional on HasDocker",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-19T23:49:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "da94aabbc4b8c51f38f4532424cf035d9d8592b1",
          "body": "Features:\n- Add package upload support (minio, aws, rsync) with CI/CD variables\n- Add ONLINECONF_DIR environment variable support in generated code\n- Add systemd EnvironmentFile override for use_envs applications\n- Generate systemd override in postinstall.sh for apps with use_envs: true\n- Clean up o\n[…]\nitHub Actions) with upload jobs\n- Update Makefile with upload-packages target\n- Add getOnlineconfDir() function to read ONLINECONF_DIR from env\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add package upload, ONLINECONF_DIR support, and systemd EnvironmentFile",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-19T23:15:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3782091e0450e9649e2c2f12a13827ff9dc768b5",
          "body": null,
          "is_bot": false,
          "headline": "Add deb packaging support",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-19T23:15:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6a4dff8f57d14b198dd2b074dc8f2b25de58faf4",
          "body": "- Workers: use {name}Worker alias (e.g. balancerWorker)\n- buf_client: use {name}Client alias (e.g. balancerClient)\n\nThis fixes \"redeclared in this block\" errors when a worker\nand a transport (API client) have the same name.\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add unique import aliases to prevent name collisions",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-19T23:15:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0c7d63711275102b9d83ae7a43bc7b1d7920de53",
          "body": "Use golang.org/x/mod/semver for proper semantic version comparison\ninstead of lexicographic string comparison which fails for versions\nlike v0.9.0 vs v0.10.0 (string comparison incorrectly shows v0.9.0 > v0.10.0).\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Fix semantic version comparison for runtime_version validation",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-19T23:15:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9aa05cb61052a7636035f8f94721898b7be320a6",
          "body": "Problem: Service was initializing ALL ogen_client/buf_client for ALL\napplications, causing errors when an app didn't need a specific client.\n\nSolution: Clients are now passed via application.SetClient() similar to\ndrivers, and initialized only if registered.\n\nChanges:\n- Add GetGrpcTransport() method\n[…]\nInitializer interface\n- Update MinRuntimeVersion to v0.10.0 (required for new IService interface)\n\nRequires: go-project-starter-runtime v0.10.0\n\nCo-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Add conditional client initialization via SetClient pattern",
          "author_name": "Nikolas",
          "author_login": "Nikolo",
          "committed_at": "2026-01-19T23:15:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 67,
      "commits_last_year": 237,
      "latest_release_at": "2026-07-17T11:29:37Z",
      "latest_release_tag": "v0.26.1",
      "releases_from_tags": false,
      "days_since_last_push": 4,
      "active_weeks_last_year": 32,
      "days_since_latest_release": 4,
      "mean_days_between_releases": 12.9
    },
    "community": {
      "has_readme": true,
      "has_license": false,
      "has_description": true,
      "has_contributing": true,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/Educentr/go-project-starter",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/Educentr/go-project-starter",
          "is_deprecated": false,
          "latest_version": "v0.26.1",
          "repository_url": "https://github.com/Educentr/go-project-starter",
          "versions_count": 99,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-17T11:22:15Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 4
        }
      ]
    },
    "popularity": {
      "forks": 1,
      "stars": 3,
      "watchers": 1,
      "fork_history": {
        "days": [
          {
            "date": "2026-01-19",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 1,
        "total_forks": 1
      },
      "star_history": {
        "days": [
          {
            "date": "2025-10-28",
            "count": 1
          },
          {
            "date": "2025-11-19",
            "count": 1
          },
          {
            "date": "2025-12-30",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 3,
        "total_stars": 3
      },
      "open_issues_and_prs": 14
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "example",
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": true,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "Makefile"
      ],
      "api_schema_files": [
        "example/admin.proto",
        "example/example.proto",
        "example/kafka_example.proto",
        "test/docker-integration/configs/combined/item.proto",
        "test/docker-integration/configs/grpc-only/item.proto"
      ],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 56778,
      "source_files_sampled": 53,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 13236
    },
    "dependencies": {
      "manifests": [
        "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/AlecAivazis/survey/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.3.7"
        },
        {
          "name": "github.com/Educentr/goat",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.3.1"
        },
        {
          "name": "github.com/go-git/go-git/v5",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v5.11.0"
        },
        {
          "name": "github.com/pkg/errors",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.9.1"
        },
        {
          "name": "github.com/spf13/pflag",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.0.5"
        },
        {
          "name": "github.com/spf13/viper",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.18.2"
        },
        {
          "name": "github.com/stretchr/testify",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.11.1"
        },
        {
          "name": "github.com/testcontainers/testcontainers-go",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.40.0"
        },
        {
          "name": "golang.org/x/mod",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.28.0"
        },
        {
          "name": "golang.org/x/text",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.30.0"
        },
        {
          "name": "gopkg.in/yaml.v3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v3.0.1"
        }
      ],
      "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": 12,
        "open_issues": 14,
        "closed_ratio": 0.263,
        "closed_issues": 5,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "Nikolo",
          "commits": 147,
          "avatar_url": "https://avatars.githubusercontent.com/u/237986?v=4"
        },
        {
          "type": "User",
          "login": "sklukin",
          "commits": 103,
          "avatar_url": "https://avatars.githubusercontent.com/u/9253280?v=4"
        },
        {
          "type": "User",
          "login": "eugenzt-art",
          "commits": 3,
          "avatar_url": "https://avatars.githubusercontent.com/u/243577399?v=4"
        }
      ],
      "contributors_sampled": 3,
      "top_contributor_share": 0.581
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "docs.yml",
        "go-version-check.yml",
        "integration-test.yml",
        "release_notification.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "go.sum"
      ],
      "scorecard": {
        "checks": [
          {
            "name": "Binary-Artifacts",
            "score": 10,
            "reason": "no binaries found in the repo",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
          },
          {
            "name": "Branch-Protection",
            "score": 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": "4 out of 4 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 1/23 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "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": 0,
            "reason": "license file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "18 commit(s) and 2 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": 1,
            "reason": "dependency not pinned by hash detected -- score normalized to 1",
            "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": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "51 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "a4788e22c2710830649ab5571c43a3295821ee85",
        "ran_at": "2026-07-22T03:26:27Z",
        "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-17T11:29:47Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-17T11:22:16Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 9,
          "created_at": "2026-01-23T00:39:20Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 12,
          "created_at": "2026-02-24T13:57:17Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 13,
          "created_at": "2026-02-24T14:51:27Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 14,
          "created_at": "2026-02-24T14:51:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 15,
          "created_at": "2026-02-24T14:51:36Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 17,
          "created_at": "2026-02-25T19:35:47Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 20,
          "created_at": "2026-04-27T07:42:28Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 21,
          "created_at": "2026-05-02T17:28:48Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 23,
          "created_at": "2026-05-05T13:01:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 24,
          "created_at": "2026-05-07T15:52:43Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 25,
          "created_at": "2026-05-14T17:23:49Z",
          "last_comment_at": "2026-06-12T15:47:25Z",
          "last_comment_author": "Nikolo"
        },
        {
          "number": 27,
          "created_at": "2026-06-17T16:53:22Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 28,
          "created_at": "2026-06-22T09:10:03Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 29,
          "created_at": "2026-06-30T15:38:05Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/Educentr/go-project-starter",
    "host": "github.com",
    "name": "go-project-starter",
    "owner": "Educentr"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 31,
        "vitality": 92,
        "community": 24,
        "governance": 52,
        "engineering": 77
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 92,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "excellent",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 86,
            "inputs": {
              "commits_last_year": 237,
              "human_commit_share": 1,
              "days_since_last_push": 4,
              "active_weeks_last_year": 32
            },
            "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": "32/52 weeks with commits",
                "points": 22.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 32
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "237 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 237
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "18 commit(s) and 2 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": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 67,
              "latest_release_tag": "v0.26.1",
              "releases_from_tags": false,
              "days_since_latest_release": 4,
              "mean_days_between_releases": 12.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "67 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 67
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 4 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~12.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 12.9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "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": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 5,
            "inputs": {
              "forks": 1,
              "stars": 3,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "below_threshold"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "3 stars",
                "points": 4.9,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "1 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "at_risk",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 45,
            "inputs": {
              "has_readme": true,
              "has_license": false,
              "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": "no license file detected",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "license_absent",
                    "params": {}
                  }
                ],
                "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": 52,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 26,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 3,
              "top_contributor_share": 0.581
            },
            "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 58% of commits",
                "points": 9.4,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 58
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "3 contributors",
                "points": 4.1,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "merged_prs": 12,
              "open_issues": 14,
              "closed_issues": 5,
              "issue_closed_ratio": 0.263,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "26% of issues closed",
                "points": 12.3,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 26
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "12/12 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 12,
                      "decided": 12
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 1/23 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": 47,
            "inputs": {
              "followers": 2,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "Educentr",
              "public_repos": 18,
              "account_age_days": 792
            },
            "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 Educentr",
                "points": 3.4,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 2,
                      "login": "Educentr"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "18 public repos, account ~2 yr old",
                "points": 13.6,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 18
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 2
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/Educentr/go-project-starter"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 4
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 4 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 4
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "99 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 99
                    }
                  }
                ],
                "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": 77,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": "4 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "4 out of 4 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://educentr.github.io/go-project-starter/",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://educentr.github.io/go-project-starter/",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": 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, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 31,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "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": "4 out of 4 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 1/23 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no dangerous workflow patterns detected",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "18 commit(s) and 2 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 1",
                "points": 0.5,
                "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": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "51 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 81,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.87,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 13236
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "87 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 87,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 72,
            "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": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.82,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "Makefile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "Makefile"
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "Go (statically typed)",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "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": "82 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 82,
                      "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 1",
                "points": 1,
                "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": 56778,
              "source_files_sampled": 53,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Go (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "Go"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/53 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 53,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "good",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 80,
            "inputs": {
              "example_dirs": [
                "example",
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": [
                "example/admin.proto",
                "example/example.proto",
                "example/kafka_example.proto",
                "test/docker-integration/configs/combined/item.proto",
                "test/docker-integration/configs/grpc-only/item.proto"
              ]
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": "example/admin.proto, example/example.proto, example/kafka_example.proto, test/docker-integration/configs/combined/item.proto, test/docker-integration/configs/grpc-only/item.proto",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "example/admin.proto, example/example.proto, example/kafka_example.proto, test/docker-integration/configs/combined/item.proto, test/docker-integration/configs/grpc-only/item.proto"
                    }
                  }
                ],
                "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": "example, examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "example, 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-22T03:26:37.783631Z",
  "schema_version": "0.26.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/e/Educentr/go-project-starter.svg",
  "full_name": "Educentr/go-project-starter",
  "license_state": "absent",
  "license_spdx": null
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.26.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计Go.