Public record
Software health reportschema 0.26.0 · metrics 1.13.0 · 2026-07-22 03:26 UTC

Educentr / go-project-starter

Fast and easy start you go project

Go · Go TemplateNo license detected★ 3 stars⑂ 1 forksince Oct 2025View on GitHub ↗

Educentr/go-project-starter holds a health index of 57 out of 100, placing it in the Moderate band. It scores highest on Vitality (92/100) and lowest on Community & Adoption (24/100). It was last updated 4 days ago. A single contributor accounts for most of its recent work.

57
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

57
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

EducentrOrganization
2 followers18 public repossince May 2024

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publish
Gogithub.com/Educentr/go-project-starterv0.26.1-994 days ago

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

92Excellent · 22% of overall
How it's scored
36/36Push recency — last push 4 days ago
22.2/36Commit cadence — 32/52 weeks with commits
18/18Commit volume — 237 commits in the last year
10/10OpenSSF Scorecard: Maintained — 18 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year237
human_commit_share1
days_since_last_push4
active_weeks_last_year32

Release discipline

100Excellent
How it's scored
27/27Ships releases — 67 releases published
36/36Release recency — latest release 4 days ago
27/27Release cadence — a release every ~12.9 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count67
latest_release_tagv0.26.1
releases_from_tagsno
days_since_latest_release4
mean_days_between_releases12.9
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

24Critical · 18% of overall
How it's scored
4.9/60Stars — 3 stars
0/25Forks — 1 forks
0/15Watchers — 1 watchers
Inputs used
forks1
stars3
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
How it's scored
22.5/22.5README
0/22.5License — no license file detected
18/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseno
has_contributingyes
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

52Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
9.4/22.5Commit distribution — top contributor authored 58% of commits
4.1/13.5Contributor breadth — 3 contributors
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled3
top_contributor_share0.581
How it's scored
12.3/46.8Issue resolution — 26% of issues closed
38.2/38.3PR acceptance — 12/12 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 1/23 approved changesets -- score normalized to 0
Inputs used
merged_prs12
open_issues14
closed_issues5
issue_closed_ratio0.263
closed_unmerged_prs0
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
3.4/25Owner reach — 2 followers of Educentr
13.6/25Track record — 18 public repos, account ~2 yr old
Inputs used
followers2
owner_typeOrganization
is_verified
owner_loginEducentr
public_repos18
account_age_days792
How it's scored
25/25Published & resolvable — 1 package(s) on go
35/35Publish recency — latest publish 4 days ago
20/20Version history — 99 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesgithub.com/Educentr/go-project-starter
ecosystemsgo
any_deprecatedno
min_days_since_publish4

Engineering Quality

Are baseline engineering and documentation practices in place?

77Good · 20% of overall
How it's scored
24/24CI workflows — 4 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 4 out of 4 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://educentr.github.io/go-project-starter/
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepagehttps://educentr.github.io/go-project-starter/
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

31At risk · 16% of overall
How it's scored
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.5License — 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 — no data
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 — no data
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 51 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3.1
Excluded from scoring (no data or not applicable): packaging, signed_releases. Remaining weights renormalized.

AI Readiness

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.

81Good · 0% of overall
How it's scored
45/45Agent instructions — CLAUDE.md
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 87 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share0.87
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes13,236
How it's scored
18/18One-command bootstrap — Makefile
22/22Automated tests
0/11Lint / format config
11/11Static type checking — Go (statically typed)
10/10Reproducible environment — Dockerfile, lockfile
10/10Demonstrated agent practice — 82 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Inputs used
has_nixno
has_testsyes
lockfilesgo.sum
has_dockerfileyes
typed_languageyes
bootstrap_filesMakefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0.82
toolchain_manifestsgo.mod
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — Go (statically typed)
55/55Manageable file sizes — 0/53 source files over 60KB
Inputs used
primary_languageGo
largest_source_bytes56,778
source_files_sampled53
oversized_source_files0
How it's scored
40/40API schema (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 server
40/40Runnable examples — example, examples
Inputs used
example_dirsexample, examples
has_mcp_signalno
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

Key facts

3GitHub stars
3contributors
237commits, last 12 months
4days since last push
67releases
1bus factor
14open issues
Gopackage ecosystems

Data collection warnings

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

More detail

Star and fork history 3 ★ / 1 ⇿
3Stars
1Forks
28Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

01122333112025-102025-122026-01
Major 0Minor 6Patch 22
OpenSSF Scorecard 3.1 / 10
3.1aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).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
n/aPackagingpackaging 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
n/aSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities51 existing vulnerabilities detected
Direct dependencies 11
RegistryPackageVersion constraintManifest
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
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "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
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.26.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsGo.