公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-28 11:31 UTC

dracory / blogstore

GoAGPL-3.0★ 1 星标⑂ 0 复刻始于 2024年2月在 GitHub 上查看 ↗

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

57
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

dracory组织
4 关注者74 个公开仓库始于 2025年3月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogithub.com/dracory/blogstorev1.34.0-522 天前

按类别列示的指标

活力

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

86优秀 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 2 天前
13.2/36提交节奏 — 52 周中有 19 周有提交
17.2/18提交量 — 最近一年 81 次提交
10/10OpenSSF Scorecard:Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
所用输入
commits_last_year81
human_commit_share0.98
days_since_last_push2
active_weeks_last_year19

发布纪律

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

社区与采用

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

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

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(AGPL-3.0)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template

可持续性与治理

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

56中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
1.7/22.5提交分布 — 头号贡献者编写了 92% 的提交
2.7/13.5贡献者广度 — 2 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled2
top_contributor_share0.925
评分方式
0/46.8议题解决 — 没有议题或无数据
38.2/38.3PR 接受 — 已裁定的 PR 中 2/2 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/28 approved changesets -- score normalized to 0
所用输入
merged_prs2
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
5/25所有者影响力 — dracory 有 4 位关注者
15.8/25既往记录 — 74 个公开仓库,账户约 1 年
所用输入
followers4
owner_typeOrganization
is_verified
owner_logindracory
public_repos74
account_age_days506
评分方式
25/25已发布且可解析 — go 上有 1 个软件包
35/35发布时效 — 最近一次发布于 2 天前
20/20版本历史 — 52 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgithub.com/dracory/blogstore
ecosystemsgo
any_deprecated
min_days_since_publish2

工程质量

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

57中等 · 占总体的 20%

工程实践

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

文档

40存在风险
评分方式
30/30README
0/25文档目录
0/15文档 / 主页站点
0/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

53中等 · 占总体的 16%

安全态势

41存在风险
评分方式
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.5许可证 — 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 — 无数据
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 — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
6.8/7.5Vulnerabilities — 1 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated16
scorecard_versionv5.5.0
checks_inconclusive2
scorecard_aggregate4.1
已排除计分(无数据或不适用):packaging, signed_releases。 其余权重已重新归一化。
评分方式
35/35直接依赖不含已知公告 — 没有直接依赖携带已知公告
0/25间接依赖不含已知公告 — 在此范围内,传递依赖集合无法与开发和测试依赖区分
0/40没有长期未处理的公告 — 没有公告带有发布日期
所用输入
sourceosv
advisories1
affected_packages1
assessed_packages21
unassessed_packages0
affected_by_severityunknown 1
direct_affected_packages0
已排除计分(无数据或不适用):间接依赖不含已知公告, 没有长期未处理的公告。 其余权重已重新归一化。 已将 21 个已解析依赖与 OSV 比对。 该仓库未发布任何索引可解析的软件包,因此改为评估仓库依赖图。该图将开发与测试版本固定同交付的依赖混在一起,因此仅对声明的运行时依赖计分;传递性发现仅作为背景信息列出,不计入评分。 未对可达性进行分析。

AI 就绪度

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

60中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 98 次人类提交中有 78 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.796
agent_instruction_files
agent_instruction_max_bytes
评分方式
12.6/18一条命令的引导启动 — go.mod(工具链约定,无任务运行器)
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
4/10已体现的代理实践 — 最近 100 次提交中有 2 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
所用输入
has_nix
has_tests
lockfilesgo.sum
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0.02
toolchain_manifestsgo.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
55/55可控的文件大小 — 采样的 30 个源文件中有 0 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes35,349
source_files_sampled30
oversized_source_files0

关键数据

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

数据采集警告

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

更多细节

OpenSSF Scorecard 4.1 / 10
4.1综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。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
不适用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
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
9Vulnerabilities1 existing vulnerabilities detected
直接依赖 6
注册表软件包版本约束清单文件
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
全部依赖 21

来自 GitHub 依赖图的完整解析依赖集合:6 个直接依赖与 15 个间接(传递)软件包。仓库提交锁文件时,传递闭包才是完整的。

注册表软件包版本关系
Gogithub.com/dracory/neatv0.33.0直接
Gogithub.com/dracory/sbv0.26.0直接
Gogithub.com/dracory/strv0.18.0直接
Gogithub.com/dromara/carbon/v2v2.6.16直接
Gogithub.com/samber/lov1.53.0直接
Gomodernc.org/sqlitev1.54.0直接
Gogithub.com/dracory/uidv1.9.0间接
Gogithub.com/dustin/go-humanizev1.0.1间接
Gogithub.com/georgysavva/scanyv1.2.3间接
Gogithub.com/google/uuidv1.6.0间接
Gogithub.com/mattn/go-isattyv0.0.24间接
Gogithub.com/ncruces/go-strftimev1.0.0间接
Gogithub.com/remyoudompheng/bigfftv0.0.0-20230129092748-24d4a6f8daec间接
Gogithub.com/spf13/castv1.10.0间接
Gogolang.org/x/cryptov0.54.0间接
Gogolang.org/x/expv0.0.0-20260718201538-764159d718ef间接
Gogolang.org/x/sysv0.47.0间接
Gogolang.org/x/textv0.40.0间接
Gomodernc.org/libcv1.74.3间接
Gomodernc.org/mathutilv1.7.1间接
Gomodernc.org/memoryv1.11.0间接
依赖安全公告 1

该仓库未发布可被索引解析的包,因此评估的是其自身的依赖图——共 21 个包,其中也包含从不交付的开发与测试版本固定:1 个存在已知公告,0 个为直接依赖。

软件包版本关系严重程度公告数修复版本
golang.org/x/cryptov0.54.0间接未知1

公告表示依赖图中记录的版本落入某条公告的受影响范围。可达性未经分析,且依赖图包含开发与测试的版本固定——某项发现可能只涉及工具链而非交付的软件。

原始 JSON 报告 机器可读
{
  "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"
}

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

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

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