Öffentliches Register
Software-GesundheitsberichtSchema 0.27.0 · Metriken 1.13.0 · 2026-07-28 11:31 UTC

dracory / blogstore

GoAGPL-3.0★ 1 Stern⑂ 0 Forksseit Feb. 2024Auf GitHub ansehen ↗

dracory/blogstore erreicht einen Gesundheitsindex von 57 von 100 und liegt damit im Bereich Mittel. Am stärksten schneidet es bei Vitality (86/100) ab, am schwächsten bei Community & Adoption (24/100). Zuletzt vor 2 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

dracoryOrganisation
4 Follower74 öffentliche Reposseit März 2025

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/dracory/blogstorev1.34.0-52vor 2 Tagen

Metriken nach Kategorie

Vitalität

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

86Exzellent · 22 % des Gesamtindex
Wie die Bewertung erfolgt
36/36Push-Aktualität — letzter Push vor 2 Tagen
13.2/36Commit-Rhythmus — 19/52 Wochen mit Commits
17.2/18Commit-Volumen — 81 Commits im letzten Jahr
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Verwendete Eingangsdaten
commits_last_year81
human_commit_share0,98
days_since_last_push2
active_weeks_last_year19

Release-Disziplin

100Exzellent
Wie die Bewertung erfolgt
27/27Liefert Releases aus — 51 Releases veröffentlicht
36/36Release-Aktualität — letztes Release vor 2 Tagen
27/27Release-Rhythmus — ein Release etwa alle 4 Tage
0/10OpenSSF Scorecard: Signed-Releases — keine Daten
Verwendete Eingangsdaten
releases_count51
latest_release_tagv1.34.0
releases_from_tagsnein
days_since_latest_release2
mean_days_between_releases4
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
0/60Stars — 1 Stars
0/25Forks — 0 Forks
0/15Watcher — 1 Watcher
Verwendete Eingangsdaten
forks0
stars1
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Wie die Bewertung erfolgt
22.5/22.5README
22.5/22.5Lizenz — anerkannte Lizenz (AGPL-3.0)
0/18CONTRIBUTING-Leitfaden
0/13.5Verhaltenskodex
0/7.2Issue-Vorlage
0/6.3PR-Vorlage
Verwendete Eingangsdaten
has_readmeja
has_licenseja
has_contributingnein
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?

56Mittel · 24 % des Gesamtindex
Wie die Bewertung erfolgt
9/54Bus-Faktor — 1 Beitragende decken die Hälfte aller Commits ab
1.7/22.5Commit-Verteilung — wichtigste beitragende Person verfasste 92 % der Commits
2.7/13.5Breite der Beitragenden — 2 Beitragende
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Verwendete Eingangsdaten
bus_factor1
contributors_sampled2
top_contributor_share0,925
Wie die Bewertung erfolgt
0/46.8Issue-Lösungsquote — keine Issues oder keine Daten
38.2/38.3PR-Annahme — 2/2 entschiedene PRs gemergt
0/15OpenSSF Scorecard: Code-Review — Found 0/28 approved changesets -- score normalized to 0
Verwendete Eingangsdaten
merged_prs2
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Issue-Lösungsquote. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
30/30Organisatorische Trägerschaft — im Besitz einer Organisation
0/20Verifizierte Domain
5/25Reichweite des Inhabers — 4 Follower von dracory
15.8/25Kontohistorie — 74 öffentliche Repos, Kontoalter ca. 1 Jahre
Verwendete Eingangsdaten
followers4
owner_typeOrganization
is_verified
owner_logindracory
public_repos74
account_age_days506

Paketpflege

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

Engineering-Qualität

Sind grundlegende Engineering- und Dokumentationspraktiken vorhanden?

57Mittel · 20 % des Gesamtindex
Wie die Bewertung erfolgt
24/24CI-Workflows — 1 Workflow(s)
24/24Tests vorhanden
0/16Linter-Konfiguration
0/9.6Pre-Commit-Hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 2 out of 2 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

40Gefährdet
Wie die Bewertung erfolgt
30/30README
0/25Dokumentationsverzeichnis
0/15Dokumentations-/Homepage-Site
0/10Repository-Beschreibung
0/10Topics
10/10Wiki
Verwendete Eingangsdaten
topics
has_wikija
homepage
has_readmeja
has_docs_dirnein
has_descriptionnein

Sicherheit

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

53Mittel · 16 % des Gesamtindex

Sicherheitslage

41Gefä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 — 2 out of 2 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/28 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
2.5/2.5Lizenz — license file detected
7.5/7.5Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
0/5Packaging — keine Daten
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
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
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
Verwendete Eingangsdaten
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4,1
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): packaging, signed_releases. Die verbleibenden Gewichte wurden renormalisiert.
Wie die Bewertung erfolgt
35/35Direkte Abhängigkeiten ohne bekannte Advisories — keine direkte Abhängigkeit trägt ein bekanntes Advisory
0/25Indirekte Abhängigkeiten ohne bekannte Advisories — transitive Menge in diesem Bereich nicht von Entwicklungs- und Test-Abhängigkeiten trennbar
0/40Keine offenen Advisories — kein Advisory trägt ein Veröffentlichungsdatum
Verwendete Eingangsdaten
sourceosv
advisories1
affected_packages1
assessed_packages21
unassessed_packages0
affected_by_severityunknown 1
direct_affected_packages0
Von der Bewertung ausgeschlossen (keine Daten oder nicht anwendbar): Indirekte Abhängigkeiten ohne bekannte Advisories, Keine offenen Advisories. Die verbleibenden Gewichte wurden renormalisiert. 21 aufgelöste Abhängigkeiten wurden mit OSV abgeglichen. Dieses Repository veröffentlicht kein Paket, das der Index auflöst; bewertet wurde daher der Abhängigkeitsgraph des Repositorys. Dieser Graph vermischt Entwicklungs- und Test-Pins mit ausgelieferten Abhängigkeiten, daher werden nur die deklarierten Laufzeit-Abhängigkeiten bewertet; transitive Befunde werden als Kontext ausgewiesen und fließen nicht in die Bewertung ein. Erreichbarkeit wird nicht analysiert.

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.

60Mittel · 0 % des Gesamtindex
Wie die Bewertung erfolgt
0/45Agentenanweisungen — keine CLAUDE.md / AGENTS.md / Editor-Regeln
0/15Maschinenlesbare Doku (llms.txt)
40/40Lesbare Commit-Historie — 78 von 98 menschlichen Commits benennen ihre Absicht (strukturierter Betreff oder erläuternder Text)
Verwendete Eingangsdaten
has_llms_txtnein
legible_history_share0,796
agent_instruction_files
agent_instruction_max_bytes
Wie die Bewertung erfolgt
12.6/18Bootstrap mit einem Befehl — go.mod (Toolchain-Konvention, kein Task-Runner)
22/22Automatisierte Tests
0/11Lint-/Format-Konfiguration
11/11Statische Typprüfung — Go (statisch typisiert)
10/10Reproduzierbare Umgebung — lockfile
4/10Belegte Agentenpraxis — 2 der letzten 100 Commits von Agenten verfasst oder ihnen zugeschrieben
0/8Automatisierte Wartung — keine automatisierten Abhängigkeits-Updates beobachtet
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Verwendete Eingangsdaten
has_nixnein
has_testsja
lockfilesgo.sum
has_dockerfilenein
typed_languageja
bootstrap_files
has_devcontainernein
has_linter_confignein
typecheck_configs
agent_commit_share0,02
toolchain_manifestsgo.mod
dependency_bot_commit_share0
Wie die Bewertung erfolgt
45/45Typprüfbarer Code — Go (statisch typisiert)
55/55Handhabbare Dateigrößen — 0/30 Quelldateien über 60 KB
Verwendete Eingangsdaten
primary_languageGo
largest_source_bytes35.349
source_files_sampled30
oversized_source_files0

Eckdaten

1GitHub-Sterne
2Mitwirkende
81Commits, letzte 12 Monate
2Tage seit letztem Push
51Releases
1Bus-Faktor
0offene Issues
GoPaket-Ökosysteme

Warnungen zur Datenerhebung

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token

Weitere Details

OpenSSF Scorecard 4.1 / 10
4.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-28 11:30 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests2 out of 2 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/28 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
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
k. A.Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
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
9Vulnerabilities1 existing vulnerabilities detected
Direkte Abhängigkeiten 6
RegistryPaketVersionsvorgabeManifest
Gogithub.com/dracory/neatv0.33.0go.mod
Gogithub.com/dracory/sbv0.26.0go.mod
Gogithub.com/dracory/strv0.18.0go.mod
Gogithub.com/dromara/carbon/v2v2.6.16go.mod
Gogithub.com/samber/lov1.53.0go.mod
Gomodernc.org/sqlitev1.54.0go.mod
Alle Abhängigkeiten 21

Vollständig aufgelöster Abhängigkeitssatz aus dem GitHub-Abhängigkeitsgraphen: 6 direkte und 15 indirekte (transitive) Pakete. Die transitive Hülle ist vollständig, wenn das Repository eine Lockfile eincheckt.

RegistryPaketVersionBeziehung
Gogithub.com/dracory/neatv0.33.0direkt
Gogithub.com/dracory/sbv0.26.0direkt
Gogithub.com/dracory/strv0.18.0direkt
Gogithub.com/dromara/carbon/v2v2.6.16direkt
Gogithub.com/samber/lov1.53.0direkt
Gomodernc.org/sqlitev1.54.0direkt
Gogithub.com/dracory/uidv1.9.0indirekt
Gogithub.com/dustin/go-humanizev1.0.1indirekt
Gogithub.com/georgysavva/scanyv1.2.3indirekt
Gogithub.com/google/uuidv1.6.0indirekt
Gogithub.com/mattn/go-isattyv0.0.24indirekt
Gogithub.com/ncruces/go-strftimev1.0.0indirekt
Gogithub.com/remyoudompheng/bigfftv0.0.0-20230129092748-24d4a6f8daecindirekt
Gogithub.com/spf13/castv1.10.0indirekt
Gogolang.org/x/cryptov0.54.0indirekt
Gogolang.org/x/expv0.0.0-20260718201538-764159d718efindirekt
Gogolang.org/x/sysv0.47.0indirekt
Gogolang.org/x/textv0.40.0indirekt
Gomodernc.org/libcv1.74.3indirekt
Gomodernc.org/mathutilv1.7.1indirekt
Gomodernc.org/memoryv1.11.0indirekt
Abhängigkeits-Advisories 1

Dieses Repository veröffentlicht kein vom Index auflösbares Paket, daher wurde sein eigener Abhängigkeitsgraph bewertet – 21 Pakete, darunter auch Entwicklungs- und Test-Pins, die nie ausgeliefert werden: 1 tragen bekannte Advisories, davon 0 direkte.

PaketVersionBeziehungSchweregradAdvisoriesBehoben in
golang.org/x/cryptov0.54.0indirektunbekannt1

Ein Advisory bedeutet, dass die im Abhängigkeitsgraphen erfasste Version in den betroffenen Bereich eines Advisories fällt. Erreichbarkeit wird nicht analysiert, und der Graph enthält Entwicklungs- und Test-Pins — ein Fund kann das Werkzeug betreffen und nicht die ausgelieferte Software.

JSON-Rohbericht maschinenlesbar
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 506,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Go": 404863
      },
      "pushed_at": "2026-07-26T03:53:00Z",
      "created_at": "2024-02-19T04:55:57Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-26T03:48:06Z",
      "description": null,
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "AGPL-3.0",
      "default_branch": "main",
      "license_spdx_raw": "AGPL-3.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "dracory",
      "company": null,
      "location": null,
      "followers": 4,
      "avatar_url": "https://avatars.githubusercontent.com/u/202408768?v=4",
      "created_at": "2025-03-08T11:35:51Z",
      "is_verified": null,
      "public_repos": 74,
      "account_age_days": 506
    },
    "license": {
      "state": "standard",
      "spdx_id": "AGPL-3.0",
      "raw_spdx": "AGPL-3.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.34.0",
          "kind": "minor",
          "published_at": "2026-07-26T03:53:01Z"
        },
        {
          "tag": "v1.33.0",
          "kind": "minor",
          "published_at": "2026-07-24T07:53:14Z"
        },
        {
          "tag": "v1.32.0",
          "kind": "minor",
          "published_at": "2026-07-24T06:51:08Z"
        },
        {
          "tag": "v1.31.0",
          "kind": "minor",
          "published_at": "2026-07-23T16:46:23Z"
        },
        {
          "tag": "v1.30.0",
          "kind": "minor",
          "published_at": "2026-07-19T21:05:25Z"
        },
        {
          "tag": "v1.29.0",
          "kind": "minor",
          "published_at": "2026-06-28T05:48:08Z"
        },
        {
          "tag": "v1.28.0",
          "kind": "minor",
          "published_at": "2026-06-27T01:54:26Z"
        },
        {
          "tag": "v1.27.0",
          "kind": "minor",
          "published_at": "2026-06-21T00:53:37Z"
        },
        {
          "tag": "v1.26.0",
          "kind": "minor",
          "published_at": "2026-06-20T23:04:52Z"
        },
        {
          "tag": "v1.25.0",
          "kind": "minor",
          "published_at": "2026-06-20T12:03:35Z"
        },
        {
          "tag": "v1.24.0",
          "kind": "minor",
          "published_at": "2026-06-15T18:59:51Z"
        },
        {
          "tag": "v1.23.0",
          "kind": "minor",
          "published_at": "2026-06-15T18:05:49Z"
        },
        {
          "tag": "v1.22.0",
          "kind": "minor",
          "published_at": "2026-05-24T22:26:10Z"
        },
        {
          "tag": "v1.21.0",
          "kind": "minor",
          "published_at": "2026-05-19T06:36:32Z"
        },
        {
          "tag": "v1.20.0",
          "kind": "minor",
          "published_at": "2026-05-13T04:05:27Z"
        },
        {
          "tag": "v1.19.0",
          "kind": "minor",
          "published_at": "2026-05-09T17:45:13Z"
        },
        {
          "tag": "v1.18.0",
          "kind": "minor",
          "published_at": "2026-05-03T12:37:25Z"
        },
        {
          "tag": "v1.17.0",
          "kind": "minor",
          "published_at": "2026-05-03T06:14:55Z"
        },
        {
          "tag": "v1.16.0",
          "kind": "minor",
          "published_at": "2026-05-02T22:06:02Z"
        },
        {
          "tag": "v1.15.0",
          "kind": "minor",
          "published_at": "2026-05-02T16:55:57Z"
        },
        {
          "tag": "v1.14.0",
          "kind": "minor",
          "published_at": "2026-05-02T16:47:32Z"
        },
        {
          "tag": "v1.13.0",
          "kind": "minor",
          "published_at": "2026-05-02T16:29:45Z"
        },
        {
          "tag": "v1.12.0",
          "kind": "minor",
          "published_at": "2026-04-08T04:57:35Z"
        },
        {
          "tag": "v1.11.0",
          "kind": "minor",
          "published_at": "2026-04-07T19:49:48Z"
        },
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2026-04-07T07:25:12Z"
        },
        {
          "tag": "v1.9.0",
          "kind": "minor",
          "published_at": "2026-04-07T06:52:47Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2026-04-07T06:34:00Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2026-03-28T23:23:10Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-03-21T06:26:20Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-02-04T22:29:14Z"
        },
        {
          "tag": "v1.4.4",
          "kind": "patch",
          "published_at": "2026-01-16T18:18:26Z"
        },
        {
          "tag": "v1.4.3",
          "kind": "patch",
          "published_at": "2026-01-15T08:31:57Z"
        },
        {
          "tag": "v1.4.2",
          "kind": "patch",
          "published_at": "2026-01-15T07:52:38Z"
        },
        {
          "tag": "v1.4.1",
          "kind": "patch",
          "published_at": "2026-01-10T06:34:52Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-01-09T08:54:12Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-01-09T02:46:19Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-01-08T18:38:23Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2025-12-06T05:34:23Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2025-11-21T10:47:00Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2025-09-01T18:27:10Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2025-04-01T18:51:51Z"
        },
        {
          "tag": "v0.9.0",
          "kind": "minor",
          "published_at": "2025-03-14T06:22:46Z"
        },
        {
          "tag": "v0.8.1",
          "kind": "patch",
          "published_at": "2024-11-28T17:51:35Z"
        },
        {
          "tag": "v0.8.0",
          "kind": "minor",
          "published_at": "2024-11-02T20:21:30Z"
        },
        {
          "tag": "v0.7.0",
          "kind": "minor",
          "published_at": "2024-10-31T06:59:34Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2024-10-31T06:55:53Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2024-09-10T07:08:28Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2024-09-08T18:39:28Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2024-04-22T00:31:21Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2024-02-19T05:45:31Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2024-02-19T05:26:51Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "6c08071c2ad7c89b880ff6501b1768f954ca42f0",
          "body": "Update dependencies to latest version",
          "is_bot": false,
          "headline": "Merge pull request #2 from dracory/jules-15759358083476341671-90594248",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-26T03:48:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0992c4b13d4ca6bcb25b9c4ca8febc118003308c",
          "body": "Co-authored-by: lesichkovm <7744963+lesichkovm@users.noreply.github.com>",
          "is_bot": true,
          "headline": "chore: update dependencies to latest versions",
          "author_name": "google-labs-jules[bot]",
          "author_login": "google-labs-jules[bot]",
          "committed_at": "2026-07-26T03:46:30Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "63cdffc5f598ef2eeaa89da76bfa17b12d07ee78",
          "body": "…amples",
          "is_bot": false,
          "headline": "docs: add media handler documentation with configuration and usage ex…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-24T07:44:03Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64833c84472bc8dd98d072e7611ccc05418f5e1c",
          "body": "…urable prefix support",
          "is_bot": false,
          "headline": "refactor: move ServeURL from Media entity to MediaHandler with config…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-24T07:43:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1f378e33656078a540a01d5d7d2d0efd94543b2e",
          "body": "… redirect support",
          "is_bot": false,
          "headline": "feat: add HTTP handler for serving blog media files with data URI and…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-24T06:49:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e1e6021e13c9acb90d80cc5171bb8923628a62f6",
          "body": "…of string concatenation",
          "is_bot": false,
          "headline": "fix: use separate arguments for OrderBy column and direction instead …",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-23T08:49:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d726de883bb5e2e7a5d807eb6cf10b4d447d53d2",
          "body": "…ults",
          "is_bot": false,
          "headline": "fix: reset limit and offset in count queries to prevent incorrect res…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-22T05:19:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3fb07a26404aa1340a92b66010ac09857ecf6f42",
          "body": "…d error handling\n\n- Upgrade github.com/dracory/neat from v0.27.0 to v0.31.0\n- Upgrade modernc.org/sqlite from v1.53.0 to v1.54.0\n- Upgrade golang.org/x/crypto from v0.53.0 to v0.54.0\n- Upgrade golang.org/x/sys from v0.46.0 to v0.47.0\n- Upgrade golang.org/x/text from v0.38.0 to v0.40.0\n- Upgrade golang.org/x/exp from v0.0.0-20260611194520-c48552f49976 to v0.0.0-20260718201538-764159d718ef\n- Upgrade github.com/mattn/go-isatty from v0.0.",
          "is_bot": false,
          "headline": "chore: upgrade neat to v0.31.0 and sqlite to v1.54.0, improve test an…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-07-19T20:58:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6752380c1ea31a4f52d8dc124e04165b3256bdc1",
          "body": "- Rename post file columns to media columns (COLUMN_URL → COLUMN_MEDIA_URL, COLUMN_FILE_TYPE → COLUMN_MEDIA_TYPE)\n- Add MEDIA_STATUS_DRAFT, MEDIA_STATUS_ACTIVE, MEDIA_STATUS_INACTIVE constants\n- Create MediaInterface with methods for ID, EntityID, Title, Description, Memo, URL, Type, Size, Extension, Sequence, Status, timestamps, and metadata operations\n- Implement mediaImplementation using neat ORM traits (ShortID, SoftDeletesMaxDate, Cre",
          "is_bot": false,
          "headline": "feat: add media entity for file attachments with metadata support",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-28T05:11:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "19b0c00e746f0d6cdaec0d777fe61b82d0edafc7",
          "body": "- Add COLUMN_URL, COLUMN_FILE_TYPE, COLUMN_FILE_SIZE, COLUMN_FILE_EXTENSION constants\n- Add PostFileTableName field to NewStoreOptions with default \"blog_post_file\"\n- Create PostFileInterface with methods for ID, PostID, Name, URL, Type, Size, Extension, Sequence, timestamps\n- Implement postFileImplementation using neat ORM traits (ShortID, SoftDeletesMaxDate, CreatedAt, UpdatedAt)\n- Add NewPostFile() and NewPostFileFromExistingData() factory functions",
          "is_bot": false,
          "headline": "feat: add post file entity for media attachments",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-27T11:30:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bec259e75f685d83386e40c45e1f78799b1eb782",
          "body": "…defaults\n\n- Upgrade github.com/dracory/neat from v0.26.0 to v0.27.0\n- Upgrade modernc.org/sqlite from v1.52.0 to v1.53.0\n- Upgrade modernc.org/libc from v1.73.4 to v1.73.5\n- Add default values to post table columns in MigrateUp()\n- Change COLUMN_TITLE from Text to String(255)\n- Change COLUMN_FEATURED from Boolean to String(3) with default \"no\"\n- Set COLUMN_STATUS default to POST_STATUS_DRAFT\n- Set COLUMN_PUBLISHED_AT default to neat.Null",
          "is_bot": false,
          "headline": "chore: upgrade neat to v0.27.0 and sqlite to v1.53.0, improve schema …",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-27T01:53:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5eec143f24244e37942515460f0e6686b4fd91a8",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade neat to v0.26.0",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-21T00:46:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cfd628fc00fea95a2f1c7aa06b87dba738e04c96",
          "body": "…78244\n\nUpdate neat to v0.25.0",
          "is_bot": false,
          "headline": "Merge pull request #1 from dracory/update-neat-v0.25.0-81253442257410…",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-20T23:02:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "11d3f9a640064b35744e408e5adfb859b221d610",
          "body": "Updated the neat dependency to version v0.25.0 and ran go mod tidy to update go.sum. Verified that all tests pass with the new version.\n\nCo-authored-by: lesichkovm <7744963+lesichkovm@users.noreply.github.com>",
          "is_bot": true,
          "headline": "build: update github.com/dracory/neat to v0.25.0",
          "author_name": "google-labs-jules[bot]",
          "author_login": "google-labs-jules[bot]",
          "committed_at": "2026-06-20T23:00:41Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e0a3f9a2b6ac2573012bfd114a31a98d566360d5",
          "body": "…ORM features\n\n- Upgrade github.com/dracory/neat from v0.15.0 to v0.23.0\n- Remove github.com/dracory/versionstore v1.3.0 dependency\n- Embed orm.ShortID and soft_delete.SoftDeletesMaxDate in versioningImplementation\n- Add db struct tags to versioningImplementation fields for ORM mapping\n- Update buildVersioningQuery() to use Model() with Select(\"*\") for automatic soft delete handling\n- Update buildPostQuery() to explicitly set table",
          "is_bot": false,
          "headline": "chore: upgrade neat to v0.23.0 and refactor versioning to use neat's …",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-20T11:15:10Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59b4829fd5fdbc571e93251adb0a76c9d489b73e",
          "body": "…ally\n\n- Remove github.com/dracory/versionstore dependency from go.mod\n- Add COLUMN_ENTITY_ID and COLUMN_ENTITY_TYPE constants\n- Replace versioningStore field with versioningTableName in storeImplementation\n- Implement versioning table migration directly in MigrateUp() and MigrateDown()\n- Reimplement all versioning methods (Create, Delete, FindByID, List, SoftDelete, Update) using neat database operations\n- Add buildVersioningQuery() helper method",
          "is_bot": false,
          "headline": "chore: remove versionstore dependency and implement versioning intern…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-20T07:31:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "49b03affeca70fd3e507f66977968de48cad55c6",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade versionstore to v1.3.0",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-15T18:57:57Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb9fc17d714641e257cec5039ea87ee8dfc4a899",
          "body": "…oft delete test",
          "is_bot": false,
          "headline": "test: fix versioning query method call from SetEntityID to SetID in s…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-15T18:54:40Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ce41c4d4530c77c7288d5c5ef1a7ff66b338f229",
          "body": "- Upgrade github.com/dracory/versionstore from v1.1.0 to v1.2.0\n- Upgrade modernc.org/libc from v1.73.3 to v1.73.4\n- Remove unused github.com/doug-martin/goqu/v9 and github.com/dracory/database dependencies\n- Update CreatedAt() to GetCreatedAt() in mcp/mcp.go\n- Update SoftDeletedAt() to GetSoftDeletedAt() in store_versioning_test.go\n- Clean up go.sum with updated dependency versions",
          "is_bot": false,
          "headline": "chore: upgrade versionstore to v1.2.0 and update method calls",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-15T18:45:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0ad5decc01d240df3d4bea40440199eb9f85c6b1",
          "body": "…t.go\n\n- Delete post_implementation.go containing postImplementation struct and methods\n- Consolidate post implementation into post.go for better code organization\n- No functional changes, pure file reorganization",
          "is_bot": false,
          "headline": "refactor: move post implementation from post_implementation.go to pos…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-15T17:58:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e7ecfae6dc13d9223fe6a2fedd88a3f6d1e2c3fc",
          "body": "…package with neat\n\n- Add NULL_DATETIME and MAX_DATETIME constants for datetime boundary values\n- Upgrade go version from 1.26 to 1.26.3\n- Replace github.com/dracory/dataobject v1.7.0 with github.com/dracory/neat v0.15.0\n- Upgrade modernc.org/sqlite from v1.50.1 to v1.52.0\n- Upgrade golang.org/x/crypto from v0.52.0 to v0.53.0\n- Upgrade golang.org/x/sys from v0.45.0 to v0.46.0\n- Upgrade golang.org/x/text from v0.37.0 to v0.38.0\n- Upgrade modern",
          "is_bot": false,
          "headline": "chore: add datetime constants, upgrade dependencies, and replace uid …",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-06-15T16:30:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7cebda12199d621ddf78c903cc7c4ff58e61accf",
          "body": "…e schema package\n\n- Upgrade github.com/dracory/sb from v0.24.0 to v0.26.0\n- Upgrade golang.org/x/crypto from v0.51.0 to v0.52.0\n- Upgrade golang.org/x/sys from v0.44.0 to v0.45.0\n- Upgrade modernc.org/libc from v1.72.3 to v1.72.4\n- Refactor migrateSlugColumn() to use schema.TableColumnExists() and schema.TableColumnAdd()\n- Replace manual SQL generation with schema package methods for column operations\n- Simplify column existence",
          "is_bot": false,
          "headline": "chore: upgrade sb to v0.26.0 and refactor slug column migration to us…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-24T22:21:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1b856e87da44caa198ffb915e1beede72f3e92d7",
          "body": "…ation methods\n\n- Upgrade github.com/dracory/versionstore from v1.0.0 to v1.1.0\n- Add context.Context parameter to MigrateUp() and MigrateDown() methods\n- Replace Exec() calls with ExecContext() in migration methods\n- Update NewStore() to pass context.Background() to MigrateUp()\n- Update versioning store migration calls to include context parameter",
          "is_bot": false,
          "headline": "chore: upgrade versionstore to v1.1.0 and add context support to migr…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-19T06:29:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1eca1c8cf9e244062e7c2b4d7134fd75561ba5ab",
          "body": "- Upgrade github.com/dracory/versionstore from v0.9.0 to v1.0.0\n- Upgrade golang.org/x/tools from v0.44.0 to v0.45.0\n- Rename AutoMigrate() to MigrateUp() and add optional transaction parameter\n- Add MigrateDown() method for dropping all blog store tables\n- Add SQL drop table methods for post, taxonomy, term, and term relation tables\n- Add getter/setter methods for all table names (post, taxonomy, term, term relation)\n- Update",
          "is_bot": false,
          "headline": "chore: upgrade versionstore to v1.0.0 and refactor migration methods",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-19T05:53:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f3c46e50a284fcdc93b30f2dbd845e7044d134e9",
          "body": "- Upgrade modernc.org/sqlite from v1.50.0 to v1.50.1\n- Add MarkAsDirty() method to PostInterface, TaxonomyInterface, TermInterface, and TermRelationInterface\n- Extend MarkAsNotDirty() to accept optional column parameters for selective dirty state management\n- Update all implementations to support column-specific dirty tracking via variadic parameters\n- Add comprehensive documentation for dirty tracking methods across all interfaces",
          "is_bot": false,
          "headline": "feat: add selective column dirty tracking and upgrade SQLite dependency",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-13T04:00:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4256af2dfcd257719951a80629ec1d085520426d",
          "body": "…sting\n\n- Remove github.com/stretchr/testify dependency from go.mod\n- Replace testify assertions with standard library if/t.Errorf patterns in id_helpers_test.go\n- Replace testify assertions with standard library if/t.Errorf patterns in mcp/content_type_test.go\n- Update go.sum to remove testify and related transitive dependencies\n- Clean up outdated dependency versions in go.sum (golang.org/x/crypto, golang.org/x/mod, etc.)",
          "is_bot": false,
          "headline": "chore: remove testify dependency and replace with standard library te…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-09T17:43:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f6c15e324e5e628a136376f97ea31ecb019b7508",
          "body": null,
          "is_bot": false,
          "headline": "test: add comprehensive versioning store test suite",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-09T17:39:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "91d8e210d07662c62cfb2f03cfbf8ff404f0f138",
          "body": "… for precise JSON filtering\n\n- Rename MetaContains to MetaEquals in PostQueryOptions for clarity on equality checks\n- Add MetaArrayContains filter for checking if JSON array fields contain specific values\n- Update postQuery() to implement MetaEquals with driver-specific JSON extraction\n- Add MetaArrayContains implementation with proper JSON array contains logic for SQLite, MySQL, and PostgreSQL\n- Fix MySQL JSON_CONTAINS syntax in",
          "is_bot": false,
          "headline": "refactor: rename MetaContains to MetaEquals and add MetaArrayContains…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-03T12:36:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a2def96e8b4322b54d37a5c3ccdd4f7133dcb35b",
          "body": "- Add Slug filter to PostQueryOptions for slug-based queries\n- Add PostFindBySlug() method to retrieve posts by slug\n- Implement slug filtering in postQuery() using COLUMN_SLUG equality check\n- Add comprehensive test suite for PostFindBySlug with existent and non-existent slugs",
          "is_bot": false,
          "headline": "feat: add PostFindBySlug method for retrieving posts by slug",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-03T06:14:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fc8f72c7d825ca8197b179e24e04ca0855cc2d3f",
          "body": "… references\n\n- Move META_KEY_OLD_SLUGS constant from post_implementation.go to constants.go\n- Rename constant value from \"_wp_old_slug\" to \"_old_slugs\"\n- Update all JSON path references in postQuery() to use META_KEY_OLD_SLUGS constant\n- Apply constant usage across SQLite, MySQL, and PostgreSQL driver implementations",
          "is_bot": false,
          "headline": "refactor: move META_KEY_OLD_SLUGS constant to constants.go and update…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T22:04:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "941614ac6f570cb3225bf4e1ff139e4681f7e558",
          "body": "…me parameter\n\n- Remove duplicate table name parameter from TableColumnAdd method call\n- Table name already specified in Column struct, no need to pass separately",
          "is_bot": false,
          "headline": "refactor: simplify TableColumnAdd call by removing redundant table na…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T16:55:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0c34bbe80e704ab83266a42a49b8e2b5dbc42b43",
          "body": "…tion\n\n- Add error handling for sql.ErrNoRows case when checking column existence\n- Set exists to false when no rows returned instead of failing migration\n- Add error logging for non-ErrNoRows database errors",
          "is_bot": false,
          "headline": "fix: handle sql.ErrNoRows in slug column existence check during migra…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T16:47:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f585d6b2c50bb6bf1c99b8f5667dbe11cc6e0ada",
          "body": "…g history\n\n- Add OldSlug filter to PostQueryOptions for old slug-based queries\n- Add PostFindByOldSlug() method to retrieve posts by old slug from history\n- Implement old slug filtering in postQuery() with driver-specific JSON array contains logic\n- Add comprehensive test suite for PostFindByOldSlug with existent and non-existent slugs",
          "is_bot": false,
          "headline": "feat: add PostFindByOldSlug method for redirect handling with old slu…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T16:28:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "05693a99690c6a34787cd38d0be9dc8088397355",
          "body": "- Add COLUMN_SLUG to post table schema with VARCHAR(255) type\n- Add SetSlug() method to PostInterface and implementation\n- Modify GetSlug() to return custom slug if set, otherwise auto-generate from title\n- Initialize slug to empty string in NewPost() defaults\n- Add PostFindBySlug() method to retrieve posts by slug\n- Add Slug filter to PostQueryOptions for slug-based queries\n- Add old slug history tracking with GetOldSlugs(), SetOldSlugs(), and AddOldSlug()",
          "is_bot": false,
          "headline": "feat: add custom slug support and old slug history tracking for posts",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T16:24:19Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4a0333d945a7bd43253ae122b69e4c95d365a513",
          "body": "… direct key access\n\n- Change JSON path from `$..key` to `$.key` for both SQLite and MySQL drivers\n- Add debug logging for SQL parameters in PostList method\n- Add comprehensive test suite for MetaContains filtering with multiple metadata scenarios",
          "is_bot": false,
          "headline": "fix: correct JSON path syntax in MetaContains query from recursive to…",
          "author_name": "Milan",
          "author_login": "lesichkovm",
          "committed_at": "2026-05-02T12:32:52Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "164b26a0f65f566ddd581cb788d933810ad0666b",
          "body": "…sequence management\n\n- Add PostAddTerm() method to append terms at the end of the sequence automatically\n- Add PostMoveTermTo() method to reorder terms by moving to a specific sequence position\n- Add internal helper methods: postMaxSequence(), postTermList(), postTermUpdateSequence()\n- Add comprehensive test suite covering sequence operations, edge cases, and error handling\n- Implement in-memory reordering algorithm with bubble",
          "is_bot": false,
          "headline": "feat: add PostAddTerm and PostMoveTermTo methods for simplified term …",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T04:56:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d76729a874ba7ce5dfbbe2d231a585bc3a6c038",
          "body": "…CRUD naming conventions\n\n- Rename PostTermAddAt to PostInsertTermAt to align with Insert/Remove pattern\n- Rename PostTermRemove to PostRemoveTerm to match object-action naming style\n- Update all method calls in implementation, tests, and MCP integration\n- Update interface documentation to reflect new method names",
          "is_bot": false,
          "headline": "refactor: rename post-term relationship methods for consistency with …",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T04:29:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5867155b6d616152bbee6a9dd57f90ce945a48f8",
          "body": "…rsions",
          "is_bot": false,
          "headline": "deps: update dracory dependencies and modernc.org/sqlite to latest ve…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T04:22:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4f225a1e120ff0c68959e0352c4153863d6d9ea0",
          "body": null,
          "is_bot": false,
          "headline": "test: add comprehensive versioning store test suite",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T04:02:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65fd91fc14c6f69ed77e303de0e49ed5ad74e325",
          "body": "…ns, and context utilities\n\n- Add package-level documentation for PostInterface describing main content entity features\n- Document all PostInterface methods with detailed comments for identity, author, content, SEO, status, timestamps, metadata, versioning, and taxonomy operations\n- Add method documentation for content type checks, status checks, and timestamp conversions\n- Document PostQueryOptions struct and all filtering, sorting, and pagination fields",
          "is_bot": false,
          "headline": "docs: add comprehensive godoc comments to post interface, query optio…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T03:26:51Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5eaa0637fa75d0567af6ec74e83b9d2439f87345",
          "body": "…aces, and store creation\n\n- Add package-level documentation for NewStore constructor and NewStoreOptions struct\n- Document versioning internal interfaces (versioningMarshalToInterface, versioningDataInterface)\n- Add method documentation for all versioning operations (create, delete, find, list, update, track)\n- Document TaxonomyInterface, TermInterface, and TermRelationInterface with detailed method comments\n- Add documentation",
          "is_bot": false,
          "headline": "docs: add comprehensive godoc comments to versioning, taxonomy interf…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T03:22:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6dcb6771faf6c69a508a8105c7bd7d8795a177f1",
          "body": "…on files\n\n- Add package-level documentation for NewPost and NewPostFromExistingData constructors\n- Document postImplementation struct and its DataObject embedding\n- Add method documentation for all post getters, setters, and helper methods\n- Document slug generation, editor types, content types, and status checks\n- Add versioning serialization/deserialization method documentation\n- Document metadata operations (GetMeta, SetMeta, GetMetas",
          "is_bot": false,
          "headline": "docs: add comprehensive godoc comments to post and store implementati…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T03:20:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "25a6cc077de60b4572de016cab2819a92f1cfb0b",
          "body": "…D method\n\n- Rename PostTermAdd to PostTermAddAt to clarify sequence parameter purpose\n- Rename PostTerms to TermListByPostID for clearer method naming convention\n- Add PostListByTermID method to retrieve posts associated with a term\n- Rename taxonomy_store.go to store_implementation_taxonomy.go for consistency\n- Add comprehensive taxonomy store test suite (641 lines)\n- Update README example to use renamed TermListByPostID method",
          "is_bot": false,
          "headline": "refactor: rename taxonomy methods for clarity and add PostListByTermI…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-08T03:08:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b2bf10149570eeb5884ebaa04ca7ee02203985fa",
          "body": "- Add COLUMN_SEQUENCE constant (renamed from COLUMN_TERM_SEQUENCE for consistency)\n- Add sequence column to term table schema with INTEGER type\n- Add GetSequence() and SetSequence() methods to TermInterface and termImplementation\n- Initialize sequence to 0 in NewTerm() defaults\n- Update TermRelation to use COLUMN_SEQUENCE constant instead of COLUMN_TERM_SEQUENCE\n- Fix parseInt() to handle negative integers correctly\n- Add comprehensive",
          "is_bot": false,
          "headline": "feat: add sequence field to Term model for ordering hierarchical terms",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T19:48:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bd2c059f6b782b97f35336e3dd4fe17df69d4208",
          "body": "…omy feature state\n\n- Add TaxonomyEnabled() method to StoreInterface\n- Implement TaxonomyEnabled() in storeImplementation to return taxonomyEnabled field\n- Enable runtime checking of taxonomy feature availability",
          "is_bot": false,
          "headline": "feat: add TaxonomyEnabled method to StoreInterface for checking taxon…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T17:12:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b59d4931503b458056fa14889af4a3dabe4f6ba5",
          "body": "…taxonomy system\n\n- Add Installation section with go get command\n- Add Setup section with NewStore configuration example\n- Add Usage section with post creation and listing examples\n- Add Taxonomy System section documenting three-table architecture\n- Document hierarchical terms, cached counts, slugs, and ordered relations features\n- Add taxonomy usage examples for creating taxonomies, terms, and post-term relationships\n- Remove detailed",
          "is_bot": false,
          "headline": "docs: add comprehensive README sections for installation, usage, and …",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T07:24:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b016be7221848ac73fa866a365f6bbd7de91ab5",
          "body": "… consistency\n\n- Rename sqlCreateTable method to sqlCreatePostTable to explicitly indicate it creates the post table\n- Update AutoMigrate to call sqlCreatePostTable instead of sqlCreateTable\n- Update method documentation to reflect new name",
          "is_bot": false,
          "headline": "refactor: rename sqlCreateTable to sqlCreatePostTable for clarity and…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T07:19:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3ad46f609a48015e26b93e5c75267353a54e756e",
          "body": "- Add TaxonomyEnabled field to NewStoreOptions for opt-in taxonomy feature\n- Add taxonomyEnabled field to storeImplementation to track taxonomy state\n- Conditionally create taxonomy tables in AutoMigrate only when enabled\n- Add taxonomy enabled checks to all taxonomy, term, and term relation store methods\n- Return descriptive errors when taxonomy methods are called while disabled\n- Update all taxonomy tests to explicitly enable",
          "is_bot": false,
          "headline": "feat: add TaxonomyEnabled flag to conditionally enable taxonomy system",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T07:07:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "13c24eab592642ac0d8713c75786e94ffc0b172d",
          "body": "- Rename post_test.go to post_implementation_test.go for consistency with implementation file naming\n- Add COLUMN_UPDATED_AT to taxonomy, term, and term_relation table schemas\n- Add comprehensive test suite for taxonomy system (681 lines)\n- Test taxonomy, term, and term relation domain models with defaults, setters, and slug normalization\n- Test store integration for create, find, list, count, update, and delete operations\n- Test post-term relationships and hierarchical term structures",
          "is_bot": false,
          "headline": "refactor: rename test files and add updated_at column to taxonomy tables",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T07:03:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b86de21ffdf5451025e42c0a93ac3bf7f226a656",
          "body": "… design proposal\n\n- Add database column constants for taxonomy tables (count, description, name, parent_id, post_id, slug, taxonomy_id, term_id, sequence)\n- Add pre-defined taxonomy type constants (TAXONOMY_CATEGORY, TAXONOMY_TAG)\n- Add detailed taxonomy system proposal document outlining three-table architecture\n- Document implementation plan covering domain models, store layer, database schema, post integration, MCP tools, and",
          "is_bot": false,
          "headline": "feat: add taxonomy system foundation with constants and comprehensive…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T06:50:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2caf2b5eb519ee7a297284884f77a63fb03b672c",
          "body": "… interface naming convention\n\n- Replace ContentType() with GetContentType() in all test files\n- Replace Editor() with GetEditor() in test assertions\n- Replace Meta() with GetMeta() in test validations\n- Replace ID() with GetID() in test lookups\n- Replace Title(), Status(), Featured(), Content() with Get-prefixed versions\n- Update all Post getter methods in post_implementation.go to use Get prefix\n- Update Slug() to GetSlug() and adjust implementation",
          "is_bot": false,
          "headline": "test: update Post method calls to use Get prefix for consistency with…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T06:34:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4b48fc2e51d2b4a2ca87cfd59ddf0e2cadfa7b96",
          "body": "…sed architecture\n\n- Rename store struct to storeImplementation to distinguish from StoreInterface\n- Update NewStore to instantiate storeImplementation instead of store\n- Change all method receivers from *store to *storeImplementation\n- Update interface implementation verification comment and variable declaration\n- Update test type assertion to expect *storeImplementation concrete type\n- Maintain all existing functionality while enabling",
          "is_bot": false,
          "headline": "refactor: rename store struct to storeImplementation for interface-ba…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T05:35:59Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ff124154f98ad213f5626887caef99bcc11720a8",
          "body": "…d architecture\n\n- Rename Post struct to postImplementation to distinguish from PostInterface\n- Update NewPost and NewPostFromExistingData to return PostInterface instead of concrete type\n- Change all method receivers from *Post to *postImplementation\n- Update interface implementation verification comment and variable declaration\n- Maintain all existing functionality while enabling interface-based polymorphism",
          "is_bot": false,
          "headline": "refactor: rename Post struct to postImplementation for interface-base…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T05:31:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "165fd2951e93fd17ae9fc8ca78997e8ba46a3e2a",
          "body": "…d of concrete type\n\n- Add PostInterface to define contract for blog post operations\n- Update all Post setter methods to return PostInterface instead of *Post\n- Expose DataObject methods (Data, DataChanged, Get, Set, Hydrate, IsDirty, MarkAsNotDirty) through Post\n- Update store methods to accept and\n[…]\nost\n- Update MCP postToMap to accept PostInterface parameter\n- Modify PostList to return []PostInterface instead of []Post\n- Update PostFindByID, PostFindPrevious, PostFindNext to return PostInterface",
          "is_bot": false,
          "headline": "refactor: change Post method receivers to return PostInterface instea…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-04-07T05:28:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "21d0231535cad894c41d843ae12211490bc64fdf",
          "body": "… descent for nested key support",
          "is_bot": false,
          "headline": "refactor: switch MetaContains JSON path from exact match to recursive…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-03-28T23:28:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "55960d4379c6e45f463fdc5b248c41a5a84af6de",
          "body": "…-database support\n\n- Add MetaContains field to PostQueryOptions for filtering posts by meta JSON key-value pairs\n- Implement database-specific JSON extraction in postQuery method\n- Support SQLite (json_extract), MySQL (JSON_UNQUOTE/JSON_EXTRACT), and PostgreSQL (->>) syntax\n- Add documentation and usage example for MetaContains field",
          "is_bot": false,
          "headline": "feat: add MetaContains filter for JSON-based post querying with cross…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-03-28T23:22:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "383e02ede6c99faca0006468889dc0897b273fe8",
          "body": "- Upgrade Go version from 1.25 to 1.26\n- Update sb from v0.15.0 to v0.20.0\n- Update versionstore from v0.5.0 to v0.6.0\n- Update samber/lo from v1.52.0 to v1.53.0\n- Update modernc.org/sqlite from v1.44.3 to v1.47.0\n- Update various indirect dependencies (crypto, sys, text, mod, tools, etc.)\n- Refactor sqlCreateTable to return error alongside SQL string\n- Update AutoMigrate to handle sqlCreateTable error return",
          "is_bot": false,
          "headline": "chore: upgrade Go to 1.26 and update dependencies to latest versions",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-03-21T06:24:25Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97c38f7090a59af6318f30ecb8a49a5d8ff7ecfa",
          "body": "…st lookups\n\n- Add GenerateShortID, ShortenID, UnshortenID, IsShortID, and NormalizeID helper functions\n- Implement Crockford Base32 encoding for shortened IDs (9-21 chars vs 32+ chars)\n- Update NewPost to use GenerateShortID instead of uid.HumanUid\n- Modify PostFindByID to normalize IDs and support both short and long ID lookups\n- Add automatic ID shortening in MCP postToMap for API responses\n- Add comprehensive tests for all ID",
          "is_bot": false,
          "headline": "feat: add ID shortening helpers and automatic ID normalization for po…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-02-04T21:15:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8303cff8d6ca2f45a9c77980de327b548bc89dab",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade dependencies to latest versions",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-02-04T21:14:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "253c94e593eea3e931582ffa84c628a9097589e6",
          "body": "Removed Gitpod link from the README.",
          "is_bot": false,
          "headline": "Remove Gitpod link from README",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-16T18:17:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fdc6545691aba4174456d8d231c6fee8296b4024",
          "body": "…mestamp on restore",
          "is_bot": false,
          "headline": "refactor: exclude timestamp fields from versioning and auto-update ti…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-16T18:16:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3cff1532b878663230870adf0037921e6c8c515e",
          "body": "…ned content\n\n- Implement UnmarshalFromVersioning to deserialize JSON content back into Post entity\n- Parse versioned data map and restore fields using Set method\n- Add error handling for JSON unmarshaling failures",
          "is_bot": false,
          "headline": "feat: add UnmarshalFromVersioning method to Post for restoring versio…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-15T08:31:04Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "244abd96def11c947033291422752600e5cb3dc5",
          "body": "- Move sortOrder initialization and OrderBy handling inside the Limit > 0 conditional block\n- Ensure sorting is only applied when pagination is active\n- Fix indentation to match conditional scope",
          "is_bot": false,
          "headline": "refactor: move sorting logic inside limit condition block in postQuery",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-14T20:21:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9d4f21dab80c56da363ec4f32d12e06b76c45c1",
          "body": "…stUpdate methods\n\n- Remove manual version creation logic from toolPostUpsert in MCP handler\n- Add automatic version tracking in PostCreate and PostUpdate using versioningTrackEntity\n- Update tests to expect version creation on both create and update operations (1 + N versions instead of N)\n- Fix test assertions to verify all expected version titles are present without assuming ordering\n- Remove redundant manual version creation from",
          "is_bot": false,
          "headline": "refactor: move version creation from post_upsert to PostCreate and Po…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-10T15:48:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c29be06f44c3256d4c5039083635c67148b3f53b",
          "body": "…content extraction\n\n- Add versioningMarshalToInterface and versioningDataInterface for flexible entity serialization\n- Implement versioningContentFromEntity to extract versionable content from entities, excluding timestamp fields\n- Add versioningCreateIfChanged to prevent duplicate versions by comparing with last version\n- Implement versioningTrackEntity as unified method for tracking entity changes\n- Add comprehensive error handling for nil",
          "is_bot": false,
          "headline": "feat: add internal versioning helper methods for entity tracking and …",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-10T15:46:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "39272d78ed5fee5bb8c3940a0f42492377a41a3d",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade dependencies to latest versions",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-10T06:07:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4290d00a023ed8cb53565bfab122bdcb7a9ce254",
          "body": "…story\n\n- Add post_versions tool to MCP tools list with support for id, limit, order_by, and sort_order parameters\n- Implement toolPostVersions method to query and return version history for blog posts\n- Add automatic version creation in toolPostUpsert before updating posts when versioning is enabled\n- Update blog_schema tool to document post_versions usage and versioning behavior\n- Add comprehensive tests for version creation, retrieval, and integration",
          "is_bot": false,
          "headline": "feat: add post_versions tool to MCP handler for retrieving version hi…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-09T08:49:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "828f9224d9a1409d2b4cbbd36b4f926f4d78d429",
          "body": "…sert tool",
          "is_bot": false,
          "headline": "refactor: consolidate post_create and post_update into single post_up…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-09T08:43:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c8e7453770a901c361ca14f19ba593dbdf79cea3",
          "body": null,
          "is_bot": false,
          "headline": "feat: add versioning support",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-09T07:28:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e00b8ac5f5fc459526dc8db4977a53693c1d863b",
          "body": "…ext options",
          "is_bot": false,
          "headline": "feat: add content_type field support with markdown, HTML, and plain t…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-09T02:41:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "940875b9f99792ce406717c6ffeb9a6c74f60348",
          "body": "…t management",
          "is_bot": false,
          "headline": "docs: add MCP (Model Context Protocol) handler for LLM-based blog pos…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2026-01-08T18:02:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12250a9d7bb3418d5d526f4209688691a3934ba2",
          "body": null,
          "is_bot": false,
          "headline": "chore: update indirect dependencies in go.mod and go.sum",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-12-06T05:31:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7de394752ae50fc1c20ad65e3a71ec25e3251dcf",
          "body": "…istency\n\n- Rename constant COLUMN_DELETED_AT to COLUMN_SOFT_DELETED_AT\n- Update Post methods: DeletedAt() to SoftDeletedAt(), DeletedAtCarbon() to SoftDeletedAtCarbon(), and SetDeletedAt() to SetSoftDeletedAt()\n- Update all references in NewPost(), PostSoftDelete(), postQuery(), and tests to use new naming convention",
          "is_bot": false,
          "headline": "refactor: rename COLUMN_DELETED_AT to COLUMN_SOFT_DELETED_AT for cons…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-21T10:54:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a0622f430c05c272e20603c758702b0cc2efcd8d",
          "body": "…ation\n\n- Add post_test.go with tests for NewPost defaults, meta handling, status helpers, and slug/image methods\n- Add store_implementation_test.go tests for PostList, PostCount, PostTrash, PostUpdate, PostSoftDeleteByID, PostDeleteByID, PostFindPrevious, PostFindNext, and query options including search, ordering, and WithDeleted flag",
          "is_bot": false,
          "headline": "test: add comprehensive unit tests for Post model and Store implement…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-21T10:45:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "090803fbafb0d34362593e842f3641ef7916d4de",
          "body": null,
          "is_bot": false,
          "headline": "chore: move dracory/database from indirect to direct dependency",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-21T10:40:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4addc81200eb0def20c93258388bb1b954ee945b",
          "body": "…ade dependencies\n\n- Rename consts.go to constants.go and blogpost.go to post.go for consistent naming\n- Add context.Context parameter to all store interface methods\n- Replace sb.NewDatabase with dracory/database package for query execution\n- Upgrade dracory/sb from v0.12.0 to v0.15.0\n- Upgrade modernc.org/sqlite from v1.40.0 to v1.40.1\n- Upgrade golang.org/x/crypto from v0.44.0 to v0.45.0\n- Update tests to use in-memory database an",
          "is_bot": false,
          "headline": "refactor: rename files for consistency, add context support, and upgr…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-21T10:39:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9eaffe5ae0c13ba78afb5aaa23a1ae621bad80af",
          "body": "…ng convention",
          "is_bot": false,
          "headline": "refactor: rename Post.go to blogpost.go for consistent lowercase nami…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-21T10:29:37Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "934a7193f2981ff1edf2df573949b32bb60e18d0",
          "body": "…/mysql, stretchr/testify, and modernc.org/sqlite",
          "is_bot": false,
          "headline": "chore: upgrade dependencies including dracory packages, go-sql-driver…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-17T08:23:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "106bb9588b482a1fc86dac585971524b37a7635f",
          "body": "…ackages, carbon/v2, samber/lo, and modernc.org/sqlite",
          "is_bot": false,
          "headline": "chore: upgrade Go to 1.25 and update dependencies including dracory p…",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-11-17T08:21:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "082d5616073316965861bb4203252d691e6c1b2c",
          "body": null,
          "is_bot": false,
          "headline": "chore: upgrade dependencies including carbon/v2 and sqlite packages",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-09-01T18:25:48Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "08c69396660233271742e31ede2d168d93347bbc",
          "body": "…JSON handling",
          "is_bot": false,
          "headline": "refactor: migrate from gouniverse to dracory dependencies and update …",
          "author_name": "Sinevia",
          "author_login": "lesichkovm",
          "committed_at": "2025-09-01T18:24:18Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "fab3aa78ea72173bd310f0d1862ac7161f7f799b",
          "body": null,
          "is_bot": false,
          "headline": "updated dependencies",
          "author_name": "lesichkovm",
          "author_login": "lesichkovm",
          "committed_at": "2025-04-01T18:50:11Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d0a7a4e3a734c2cef24b26a9c0b3e6d9bc13990",
          "body": null,
          "is_bot": false,
          "headline": "updated dependencies",
          "author_name": "lesichkovm",
          "author_login": "lesichkovm",
          "committed_at": "2025-03-14T06:18:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9c67649f19e3b74561498574b1fad20e14d5c38f",
          "body": null,
          "is_bot": false,
          "headline": "updated interface",
          "author_name": "lesichkovm",
          "author_login": "lesichkovm",
          "committed_at": "2025-03-14T06:14:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6f79b5662091ccde7ccc56b06bcc5a8bafef87cd",
          "body": null,
          "is_bot": false,
          "headline": "Merge branch 'main'",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-11-28T17:50:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43212737210d23b817c081cb189d007ab839ab6d",
          "body": null,
          "is_bot": false,
          "headline": "upgraded carbon",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-11-28T17:46:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fe460356c43ff381a42687535ed64c2073ee56d",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-11-04T19:25:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "eb1ef6987df02172b01a70a2ce7e8f4aafadf1bb",
          "body": null,
          "is_bot": false,
          "headline": "Update LICENSE",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-11-04T19:23:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "16eebd50a20b7f829d97db11071b2e0ba5346f54",
          "body": null,
          "is_bot": false,
          "headline": "updated dependencies",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-11-02T20:19:46Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c75bd8cab88512ae79be789d770bde9c43b4f9d6",
          "body": null,
          "is_bot": false,
          "headline": "updated soft delete logic to use max date time",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-11-02T20:15:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5d357d69cfa723d041ca24eae2734d6d59acb55d",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-10-31T06:58:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92a5255dcf1cc783fb2a2e270179f88479cb86c4",
          "body": null,
          "is_bot": false,
          "headline": "Create LICENSE_COMMERCIAL.txt",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-10-31T06:57:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2d915de93ab99b131a41e5eabc26bc2ce545069d",
          "body": null,
          "is_bot": false,
          "headline": "added new editor",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-10-31T02:26:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "559385817c663cc0aa565c0c31eb7c073d99a444",
          "body": null,
          "is_bot": false,
          "headline": "updated search to be case insensitive",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-09-10T06:39:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e0e3a869d09dcf5b95eb64385d9ad1d55e9622e1",
          "body": null,
          "is_bot": false,
          "headline": "updated dependencies",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-09-08T18:38:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "018706f20ce4da5c3a5e1dfdcea737e2e5ed0b37",
          "body": null,
          "is_bot": false,
          "headline": "Update tests.yml",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-09-08T18:35:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0d9b7506d2d47be3d8e94fd8643f4b4e02d58237",
          "body": null,
          "is_bot": false,
          "headline": "added search option",
          "author_name": "Milan Lesichkov",
          "author_login": "lesichkovm",
          "committed_at": "2024-09-08T18:31:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "59f1e52623b930ba8b217fe20ba29244ae765594",
          "body": null,
          "is_bot": false,
          "headline": "added editor",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-08-23T20:46:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3968fced04a7b0d3fe8014901b4221cabe45ae2b",
          "body": null,
          "is_bot": false,
          "headline": "added memo attribute",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-08-23T06:04:09Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "17e28598d0841ffab367d6fe28879f165594aded",
          "body": null,
          "is_bot": false,
          "headline": "added IsDraft method",
          "author_name": "Sinevia",
          "author_login": "Sinevia",
          "committed_at": "2024-08-22T05:11:42Z",
          "body_truncated": false,
          "is_coding_agent": false
        }
      ],
      "releases_count": 51,
      "commits_last_year": 81,
      "latest_release_at": "2026-07-26T03:53:01Z",
      "latest_release_tag": "v1.34.0",
      "releases_from_tags": false,
      "days_since_last_push": 2,
      "active_weeks_last_year": 19,
      "days_since_latest_release": 2,
      "mean_days_between_releases": 4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": false,
      "has_contributing": false,
      "health_percentage": 37,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "github.com/dracory/blogstore",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": true,
          "registry_url": "https://pkg.go.dev/github.com/dracory/blogstore",
          "is_deprecated": false,
          "latest_version": "v1.34.0",
          "repository_url": "https://github.com/dracory/blogstore",
          "versions_count": 52,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-26T03:48:02Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 2
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 1,
      "watchers": 1,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "go.mod"
      ],
      "largest_source_bytes": 35349,
      "source_files_sampled": 30,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": "repository_graph",
        "source": "osv",
        "findings": [
          {
            "name": "golang.org/x/crypto",
            "direct": false,
            "version": "v0.54.0",
            "severity": "unknown",
            "ecosystem": "go",
            "cvss_score": null,
            "advisory_ids": [
              "GO-2026-5932"
            ],
            "fixed_version": null,
            "advisory_count": 1,
            "oldest_advisory_days": 20
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "unknown": 1
        },
        "advisory_count": 1,
        "affected_count": 1,
        "assessed_count": 21,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/dracory/neat",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.33.0"
        },
        {
          "name": "github.com/dracory/sb",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.26.0"
        },
        {
          "name": "github.com/dracory/str",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.18.0"
        },
        {
          "name": "github.com/dromara/carbon/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.6.16"
        },
        {
          "name": "github.com/samber/lo",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.53.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.54.0"
        }
      ],
      "all_dependencies": {
        "error": null,
        "source": "github-sbom",
        "packages": [
          {
            "name": "github.com/dracory/neat",
            "direct": true,
            "version": "v0.33.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dracory/sb",
            "direct": true,
            "version": "v0.26.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dracory/str",
            "direct": true,
            "version": "v0.18.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dromara/carbon/v2",
            "direct": true,
            "version": "v2.6.16",
            "ecosystem": "go"
          },
          {
            "name": "github.com/samber/lo",
            "direct": true,
            "version": "v1.53.0",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/sqlite",
            "direct": true,
            "version": "v1.54.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dracory/uid",
            "direct": false,
            "version": "v1.9.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/dustin/go-humanize",
            "direct": false,
            "version": "v1.0.1",
            "ecosystem": "go"
          },
          {
            "name": "github.com/georgysavva/scany",
            "direct": false,
            "version": "v1.2.3",
            "ecosystem": "go"
          },
          {
            "name": "github.com/google/uuid",
            "direct": false,
            "version": "v1.6.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/mattn/go-isatty",
            "direct": false,
            "version": "v0.0.24",
            "ecosystem": "go"
          },
          {
            "name": "github.com/ncruces/go-strftime",
            "direct": false,
            "version": "v1.0.0",
            "ecosystem": "go"
          },
          {
            "name": "github.com/remyoudompheng/bigfft",
            "direct": false,
            "version": "v0.0.0-20230129092748-24d4a6f8daec",
            "ecosystem": "go"
          },
          {
            "name": "github.com/spf13/cast",
            "direct": false,
            "version": "v1.10.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/crypto",
            "direct": false,
            "version": "v0.54.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/exp",
            "direct": false,
            "version": "v0.0.0-20260718201538-764159d718ef",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/sys",
            "direct": false,
            "version": "v0.47.0",
            "ecosystem": "go"
          },
          {
            "name": "golang.org/x/text",
            "direct": false,
            "version": "v0.40.0",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/libc",
            "direct": false,
            "version": "v1.74.3",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/mathutil",
            "direct": false,
            "version": "v1.7.1",
            "ecosystem": "go"
          },
          {
            "name": "modernc.org/memory",
            "direct": false,
            "version": "v1.11.0",
            "ecosystem": "go"
          }
        ],
        "collected": true,
        "truncated": false,
        "total_count": 21,
        "direct_count": 6,
        "indirect_count": 15
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 2,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 1,
      "top_contributors": [
        {
          "type": "User",
          "login": "lesichkovm",
          "commits": 99,
          "avatar_url": "https://avatars.githubusercontent.com/u/7744963?v=4"
        },
        {
          "type": "User",
          "login": "Sinevia",
          "commits": 8,
          "avatar_url": "https://avatars.githubusercontent.com/u/3450815?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.925
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "tests.yml"
      ],
      "has_docs_dir": false,
      "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": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
          },
          {
            "name": "CII-Best-Practices",
            "score": 0,
            "reason": "no effort to earn an OpenSSF best practices badge detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
          },
          {
            "name": "Code-Review",
            "score": 0,
            "reason": "Found 0/28 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": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 10,
            "reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 0,
            "reason": "dependency not pinned by hash detected -- score normalized to 0",
            "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": 9,
            "reason": "1 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "6c08071c2ad7c89b880ff6501b1768f954ca42f0",
        "ran_at": "2026-07-28T11:30:52Z",
        "aggregate_score": 4.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-26T03:48:39Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-26T03:48:02Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/dracory/blogstore",
    "host": "github.com",
    "name": "blogstore",
    "owner": "dracory"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 57,
      "inputs": {
        "security": 53,
        "vitality": 86,
        "community": 24,
        "governance": 56,
        "engineering": 57
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 81,
              "human_commit_share": 0.98,
              "days_since_last_push": 2,
              "active_weeks_last_year": 19
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "19/52 weeks with commits",
                "points": 13.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 19
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "81 commits in the last year",
                "points": 17.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 81
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "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": 51,
              "latest_release_tag": "v1.34.0",
              "releases_from_tags": false,
              "days_since_latest_release": 2,
              "mean_days_between_releases": 4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "51 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 51
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 2 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4
                    }
                  }
                ],
                "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": 2,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "last human commit 2 days ago",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_maintained",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "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": 1,
            "inputs": {
              "forks": 0,
              "stars": 1,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "1 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (AGPL-3.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "AGPL-3.0"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": 56,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 16,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.925
            },
            "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 92% of commits",
                "points": 1.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 92
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 72,
            "inputs": {
              "merged_prs": 2,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "2/2 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 2,
                      "decided": 2
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 51,
            "inputs": {
              "followers": 4,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "dracory",
              "public_repos": 74,
              "account_age_days": 506
            },
            "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": "4 followers of dracory",
                "points": 5,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 4,
                      "login": "dracory"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "74 public repos, account ~1 yr old",
                "points": 15.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 74
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 1
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "github.com/dracory/blogstore"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 2
            },
            "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 2 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 2
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "52 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 52
                    }
                  }
                ],
                "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": "moderate",
        "name": "Engineering Quality",
        "value": 57,
        "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": "1 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "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": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "at_risk",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "has_description": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 0,
                "status": "missed",
                "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": "moderate",
        "name": "Security",
        "value": 53,
        "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": 41,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 16,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 2,
              "scorecard_aggregate": 4.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": "2 out of 2 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/28 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 detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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": "1 existing vulnerabilities detected",
                "points": 6.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "excellent",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): Indirect dependencies free of known advisories, No advisories left outstanding. Remaining weights renormalized. Matched 21 resolved dependencies against OSV. This repository publishes no package the index resolves, so the repository dependency graph was assessed instead. That graph mixes development and test pins with shipped dependencies, so only the declared runtime dependencies are scored; transitive findings are reported as context and excluded from the score. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "indirect_dependencies_free_of_known_advisories",
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_repository",
                "params": {
                  "assessed": 21
                }
              },
              {
                "code": "advisories_repo_graph_caveat",
                "params": {}
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 1,
              "affected_packages": 1,
              "assessed_packages": 21,
              "unassessed_packages": 0,
              "affected_by_severity": "unknown 1",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "transitive set not separable from development and test dependencies in this scope",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_scope_not_separable",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 21,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 1
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 60,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.796,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "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": "78 of 98 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 78,
                      "sampled": 98
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.02,
              "toolchain_manifests": [
                "go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "go.mod (toolchain convention, no task runner)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "toolchain_convention",
                    "params": {
                      "files": "go.mod"
                    }
                  }
                ],
                "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": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "2 of the last 100 commits agent-authored or agent-credited",
                "points": 4,
                "status": "partial",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 2,
                      "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 0",
                "points": 0,
                "status": "missed",
                "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": 35349,
              "source_files_sampled": 30,
              "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/30 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 30,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T11:31:00.265409Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dracory/blogstore.svg",
  "full_name": "dracory/blogstore",
  "license_state": "standard",
  "license_spdx": "AGPL-3.0"
}

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.27.0 — vollständige Methodik · Metriken-Wiki.

Wie ein einzelnes Ergebnis im Gesamtregister steht: aggregierte StatistikenGo.