Öffentliches Register
Software-GesundheitsberichtSchema 0.26.0 · Metriken 1.13.0 · 2026-07-22 03:26 UTC

Educentr / go-project-starter

Fast and easy start you go project

Go · Go TemplateKeine Lizenz erkannt★ 3 Sterne⑂ 1 Forkseit Okt. 2025Auf GitHub ansehen ↗

Educentr/go-project-starter erreicht einen Gesundheitsindex von 57 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (92/100) ab, am schwächsten bei Community & Adoption (24/100). Zuletzt vor 4 Tagen aktualisiert. Ein einzelner Mitwirkender trägt den Großteil der jüngsten Arbeit.

57
gesamt / 100
Mittel

Software-Gesundheitsindex

Metriken werden auf einer Skala von 1–100 in gewichtete Kategorien gruppiert. Der Gesamtwert beginnt als ihr Mittel; sobald öffentliche Evidenz die Richtlinie für Hochrisikojurisdiktionen auslöst, wird die Bewertung angepasst und erhält die Obergrenze 49 (Gefährdet). AI Readiness liegt außerhalb.

57
Exzellent85-100Vorbildlich; erfüllt im Wesentlichen alle geprüften Kriterien
Gut70-84Gesund; geringfügige Lücken
Mittel50-69Akzeptabel mit deutlichen Lücken; Überprüfung empfohlen
Gefährdet30-49Erhebliche Schwächen; eine Übernahme erfordert Vorsicht
Kritisch1-29Schwerwiegende Probleme (aufgegeben, nur ein Maintainer, keine Hygiene)
VitalitätCommunity &VerbreitungNachhaltigkeit &GovernanceEngineering-QualitätSicherheitAI Readiness

Bewertungsprofil

Jede Achse ist eine Kategorie. Die Form zählt mehr als der Durchschnitt — ein gesundes Projekt füllt die gesamte Fläche, während ein Profil aus Spitzen und Kratern bedeutet, dass Stärke in einer Dimension Risiken in einer anderen verdeckt.

Eigentümerschaft

EducentrOrganisation
2 Follower18 öffentliche Reposseit Mai 2024

Dieses Repository wird von einer Organisation getragen — geteilte, rechenschaftspflichtige Trägerschaft, die jeden einzelnen Maintainer überdauern kann.

Paket-Ökosysteme

RegistryPaketVersionDownloads / MonatVersionenZuletzt veröffentlicht
Gogithub.com/Educentr/go-project-starterv0.26.1-99vor 4 Tagen

Metriken nach Kategorie

Vitalität

Lebt das Projekt — wird Code geschrieben und werden Releases ausgeliefert?

92Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 4 Tagen
22.2/36Commit-Rhythmus — 32/52 Wochen mit Commits
18/18Commit-Volumen — 237 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 18 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year237
human_commit_share1
days_since_last_push4
active_weeks_last_year32

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 67 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 4 Tagen
27/27Release-Rhythmus — ein Release etwa alle 12,9 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count67
latest_release_tagv0.26.1
releases_from_tagsnein
days_since_latest_release4
mean_days_between_releases12,9
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): OpenSSF Scorecard: Signed-Releases. Die verbleibenden Gewichte wurden renormalisiert.

Community & Verbreitung

Hat das Projekt Nutzer, Downloads, Aufmerksamkeit und ein einladendes Umfeld für Beitragende?

24Kritisch · 18 % des Gesamtindex
Wie die Bewertung erfolgt
4.9/60Stars — 3 Stars
0/25Forks — 1 Forks
0/15Watcher — 1 Watcher
Verwendete Eingangsdaten
forks1
stars3
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonbelow_threshold
Wie die Bewertung erfolgt
22.5/22.5README
0/22.5Lizenz — keine Lizenzdatei erkannt
18/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licensenein
has_contributingja
has_issue_templatenein
has_code_of_conductnein
has_pull_request_templatenein

Nachhaltigkeit & Governance

Überdauert das Projekt die Menschen, die es tragen — Bus-Faktor, Reaktionsfähigkeit, Trägerschaft und Paketpflege?

52Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
9.4/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 58 % der Commits
4.1/13.5Breite der Beitragenden — 3 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled3
top_contributor_share0,581
Wie die Bewertung erfolgt
12.3/46.8Issue-Lösungsquote — 26 % der Issues geschlossen
38.2/38.3PR-Annahme — 12/12 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 1/23 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs12
open_issues14
closed_issues5
issue_closed_ratio0,263
closed_unmerged_prs0
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
3.4/25Reichweite des Inhabers — 2 Follower von Educentr
13.6/25Kontohistorie — 18 öffentliche Repos, Kontoalter ca. 2 Jahre
Verwendete Eingangsdaten
followers2
owner_typeOrganization
is_verified
owner_loginEducentr
public_repos18
account_age_days792

Paketpflege

100Exzellent
Wie die Bewertung erfolgt
25/25Veröffentlicht & auflösbar — 1 Paket(e) auf go
35/35Veröffentlichungsaktualität — letzte Veröffentlichung vor 4 Tagen
20/20Versionshistorie — 99 veröffentlichte Versionen
20/20Nicht veraltet — aktiv, nicht veraltet oder zurückgezogen
Verwendete Eingangsdaten
packagesgithub.com/Educentr/go-project-starter
ecosystemsgo
any_deprecatednein
min_days_since_publish4

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

77Gut · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 4 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
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
Verwendete Eingangsdaten
has_cija
has_testsja
has_editorconfignein
has_linter_confignein
has_precommit_confignein

Dokumentation

90Exzellent
Wie die Bewertung erfolgt
30/30README
25/25Dokumentationsverzeichnis
15/15Dokumentations-/Homepage-Site — https://educentr.github.io/go-project-starter/
10/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepagehttps://educentr.github.io/go-project-starter/
has_readmeja
has_docs_dirja
has_descriptionja

Sicherheit

Sind die sichtbaren Sicherheits- und Lieferkettenpraktiken belastbar, ohne ungeklärte Exposition gegenüber Hochrisikojurisdiktionen?

31Gefährdet · 16 % des Gesamtindex

Sicherheitslage

31Gefährdet
Wie die Bewertung erfolgt
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.5Lizenz — 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 — keine Daten
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 — keine Daten
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 51 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate3,1
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.

AI Readiness

Wie gut ist das Repository dafür ausgestattet, mit KI-Coding-Agenten entwickelt und gepflegt zu werden? Ein unabhängiges, experimentelles Badge — Gewicht 0,0, es wird eigenständig ausgewiesen und verändert den Gesamt-Gesundheitswert nicht.

81Gut · 0 % des Gesamtindex
Wie die Bewertung erfolgt
45/45Agentenanweisungen — CLAUDE.md
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 87 von 100 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,87
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes13.236
Wie die Bewertung erfolgt
18/18Bootstrap mit einem Befehl — Makefile
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — Dockerfile, lockfile
10/10Belegte Agentenpraxis — 82 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesgo.sum
has_dockerfileja
typed_languageja
bootstrap_filesMakefile
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0,82
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
55/55Handhabbare Dateigrößen — 0/53 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes56.778
source_files_sampled53
oversized_source_files0
Wie die Bewertung erfolgt
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/40Lauffähige Beispiele — example, examples
Verwendete Eingangsdaten
example_dirsexample, examples
has_mcp_signalnein
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

Eckdaten

3GitHub-Sterne
3Mitwirkende
237Commits, letzte 12 Monate
4Tage seit letztem Push
67Releases
1Bus-Faktor
14offene Issues
GoPaket-Ökosysteme

Warnungen zur Datenerhebung

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

Weitere Details

Stern- und Fork-Verlauf 3 ★ / 1 ⇿
3Sterne
1Forks
28Releases

Wann jeder Stern und Fork hinzugefügt wurde, von GitHub erfasst und nach Tagen gruppiert. Das kumulierte Wachstum steht direkt über den täglichen Zugängen, aus denen es besteht, sodass beide gegeneinander lesbar sind: stetiger organischer Zuwachs sieht ganz anders aus als ein abrupter, kurzlebiger Ausschlag. Wo dieser Unterschied messbar ist, wird er als Wachstumsauthentizität ausgewiesen.

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

Unabhängige, werkzeugneutrale Sicherheitsbewertung durch das quelloffene OpenSSF Scorecard. Jede Prüfung honoriert eine Sicherheits-Praxis, nicht das Werkzeug eines bestimmten Anbieters. Prüfungen, die Scorecard nicht ermitteln konnte, sind mit k. A. markiert und vom Sicherheitswert ausgeschlossen (nie als null gezählt).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
k. A.Packagingpackaging workflow not detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
k. A.Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities51 existing vulnerabilities detected
Direkte Abhängigkeiten 11
RegistryPaketVersionsvorgabeManifest
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
Alle Abhängigkeiten nicht erhoben

Der aufgelöste Abhängigkeitssatz konnte für diesen Bericht nicht erhoben werden: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

JSON-Rohbericht maschinenlesbar
{
  "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
}

Bewertungen sind Signale, keine Garantien. Sie spiegeln öffentlich sichtbare Praxis auf GitHub wider — kein Code-Audit und keine Sicherheitsgarantie.

Fehlende Daten werden ausgeschlossen und die Gewichte neu normiert, nie als null bewertet. Die Methodik ist versioniert und offen: Metriken v1.13.0, Schema v0.26.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenGo.