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

go-again / sqlite

CGo-free SQLite driver for Go

GoApache-2.0★ 3 星标⑂ 0 复刻始于 2026年5月在 GitHub 上查看 ↗

go-again/sqlite 的健康指数为 100 分中的 53 分,处于「中等」区间。 其得分最高的类别是Engineering Quality(88/100),最低的是Community & Adoption(26/100)。 最近一次更新在 9 天前。 近期的大部分工作由 1 位贡献者完成。

53
总分 / 100
中等

软件健康指数

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

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

评分画像

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

所有权

go-again组织
0 关注者12 个公开仓库始于 2022年12月

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

软件包生态系统

注册表软件包版本月下载量版本数最近发布
Gogosqlite.orgv0.14.0-169 天前
Gogosqlite.org/gormv0.14.0-79 天前
Gogosqlite.org/blobstorev0.14.0-69 天前

按类别列示的指标

活力

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

73良好 · 占总体的 22%
评分方式
28.8/36推送新近度 — 最近一次推送于 9 天前
8.3/36提交节奏 — 52 周中有 12 周有提交
18/18提交量 — 最近一年 158 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year158
human_commit_share1
days_since_last_push9
active_weeks_last_year12

发布纪律

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

社区与采用

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

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

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(Apache-2.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

可持续性与治理

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

40存在风险 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
5.7/22.5提交分布 — 头号贡献者编写了 75% 的提交
2.7/13.5贡献者广度 — 2 位贡献者
10/10OpenSSF Scorecard:Contributors — project has 4 contributing companies or organizations
所用输入
bus_factor1
contributors_sampled2
top_contributor_share0.747
评分方式
0/46.8议题解决 — 没有议题或无数据
0/38.3PR 接受 — 没有已裁定的拉取请求或无数据
0/15OpenSSF Scorecard:Code-Review — Found 0/30 approved changesets -- score normalized to 0
所用输入
merged_prs0
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs0
已排除计分(无数据或不适用):议题解决, PR 接受。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
0/25所有者影响力 — go-again 有 0 位关注者
15.3/25既往记录 — 12 个公开仓库,账户约 3 年
所用输入
followers0
owner_typeOrganization
is_verified
owner_logingo-again
public_repos12
account_age_days1,307
评分方式
25/25已发布且可解析 — go 上有 3 个软件包
35/35发布时效 — 最近一次发布于 9 天前
20/20版本历史 — 16 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packagesgosqlite.org, gosqlite.org/gorm, gosqlite.org/blobstore
ecosystemsgo
any_deprecated
min_days_since_publish9

工程质量

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

88优秀 · 占总体的 20%

工程实践

80良好
评分方式
24/24CI 工作流 — 1 个工作流
24/24存在测试
16/16Linter 配置 — .golangci.yml
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 无数据
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config
已排除计分(无数据或不适用):OpenSSF Scorecard:CI-Tests。 其余权重已重新归一化。

文档

100优秀
评分方式
30/30README
25/25文档目录
15/15文档 / 主页站点 — https://gosqlite.com
10/10仓库描述
10/10主题标签 — 2 个主题标签
10/10Wiki
所用输入
topicsgolang, sqlite
has_wiki
homepagehttps://gosqlite.com
has_readme
has_docs_dir
has_description

安全

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

31存在风险 · 占总体的 16%

安全态势

31存在风险
评分方式
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
0/2.5CI-Tests — 无数据
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/30 approved changesets -- score normalized to 0
2.5/2.5Contributors — project has 4 contributing companies or organizations
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
5/5Fuzzing — project is fuzzed
2.5/2.5许可证 — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — 无数据
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
0/7.5Vulnerabilities — 18 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated15
scorecard_versionv5.5.0
checks_inconclusive3
scorecard_aggregate3.1
已排除计分(无数据或不适用):ci_tests, packaging, signed_releases。 其余权重已重新归一化。

AI 就绪度

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

75良好 · 占总体的 0%
评分方式
45/45代理指令 — AGENTS.md, CLAUDE.md
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 100 次人类提交中有 87 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.87
agent_instruction_filesAGENTS.md, CLAUDE.md
agent_instruction_max_bytes20,693
评分方式
18/18一条命令的引导启动 — justfile
22/22自动化测试
11/11Lint / 格式化配置 — .golangci.yml
11/11静态类型检查 — Go(静态类型)
10/10可复现环境 — lockfile
0/10已体现的代理实践 — 最近 100 次提交中没有代理编写的提交
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_filesjustfile
has_devcontainer
has_linter_config
typecheck_configs
agent_commit_share0
toolchain_manifestsblobstore/go.mod, crypto/keyring/go.mod, examples/encrypted-blobstore/go.mod, examples/liteorm/go.mod, examples/vault-blobstore/go.mod, go.mod, gorm/go.mod, vfs/crypto/go.mod, vfs/vault/go.mod, xorm-compat/go.mod
dependency_bot_commit_share0
评分方式
45/45可类型检查的代码 — Go(静态类型)
55/55可控的文件大小 — 采样的 517 个源文件中有 0 个超过 60KB
所用输入
primary_languageGo
largest_source_bytes42,041
source_files_sampled517
oversized_source_files0

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — example, examples
所用输入
example_dirsexample, examples
has_mcp_signal
api_schema_files

关键数据

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

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

更多细节

OpenSSF Scorecard 3.1 / 10
3.1综合

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

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
不适用CI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
10Contributorsproject has 4 contributing companies or organizations
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
不适用Packagingpackaging workflow not detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
0Vulnerabilities18 existing vulnerabilities detected
直接依赖 14
注册表软件包版本约束清单文件
Gogithub.com/go-again/azv0.4.0blobstore/go.mod
Gogosqlite.orgv0.14.0blobstore/go.mod
Gogithub.com/cespare/xxhash/v2v2.3.0go.mod
Gogithub.com/google/uuidv1.6.0go.mod
Gogolang.org/x/cryptov0.53.0go.mod
Gogolang.org/x/textv0.38.0go.mod
Golukechampine.com/blake3v1.4.1go.mod
Gomodernc.org/libcv1.74.1go.mod
Gomodernc.org/sqlitev1.54.0go.mod
Gogorm.io/gormv1.31.1gorm/go.mod
Gogosqlite.orgv0.14.0gorm/go.mod
Gomodernc.org/sqlitev1.54.0gorm/go.mod
Gogosqlite.orgv0.0.0xorm-compat/go.mod
Goxorm.io/xormv1.3.11xorm-compat/go.mod
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [
        "golang",
        "sqlite"
      ],
      "is_fork": false,
      "size_kb": 2151,
      "has_wiki": true,
      "homepage": "https://gosqlite.com",
      "languages": {
        "Go": 2644421,
        "Just": 23982
      },
      "pushed_at": "2026-07-18T17:13:32Z",
      "created_at": "2026-05-26T05:45:28Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-18T17:10:00Z",
      "description": "CGo-free SQLite driver for Go",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "Apache-2.0",
      "default_branch": "main",
      "license_spdx_raw": "Apache-2.0",
      "primary_language": "Go",
      "significant_languages": [
        "Go"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "go-again",
      "company": null,
      "location": null,
      "followers": 0,
      "avatar_url": "https://avatars.githubusercontent.com/u/121585095?v=4",
      "created_at": "2022-12-28T22:57:57Z",
      "is_verified": null,
      "public_repos": 12,
      "account_age_days": 1307
    },
    "license": {
      "state": "standard",
      "spdx_id": "Apache-2.0",
      "raw_spdx": "Apache-2.0",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.14.0",
          "kind": "minor",
          "published_at": "2026-07-18T17:31:40Z"
        },
        {
          "tag": "v0.13.0",
          "kind": "minor",
          "published_at": "2026-07-18T17:30:42Z"
        },
        {
          "tag": "v0.12.0",
          "kind": "minor",
          "published_at": "2026-06-29T01:37:07Z"
        },
        {
          "tag": "v0.7.1",
          "kind": "patch",
          "published_at": "2026-06-15T19:50:43Z"
        },
        {
          "tag": "v0.6.0",
          "kind": "minor",
          "published_at": "2026-06-12T23:42:06Z"
        },
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-06-05T20:03:37Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-05-29T13:56:31Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-05-27T17:36:35Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-05-26T20:34:26Z"
        },
        {
          "tag": "v0.1.0",
          "kind": "minor",
          "published_at": "2026-05-26T05:55:36Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "5ebbe8b29aac7ec97acb16c1ec09bb27c7295af3",
          "body": null,
          "is_bot": false,
          "headline": "release v0.14.0: pin intra-repo gosqlite.org requires to v0.14.0",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-07-18T16:35:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c39c73e3f57b395df2c350d149c7ca8e8e07794d",
          "body": "…ration\n\nAdd a created_at column to the objects table, stamped with the store clock\nat Create and Clone and back-filled on pre-existing stores (an idempotent\nALTER that tolerates a concurrent-Open race). Expose it through three\nenumeration primitives for an age-aware referential/orphan sweep:\n\n  - L\n[…]\nfter returns one keyset page over the primary key.\n\nAll three exclude internal version-snapshot objects, so a sweep over the\nresult never deletes a snapshot and corrupts the version that points at it.",
          "is_bot": false,
          "headline": "feat(blobstore): record object creation time and add scale-safe enume…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-07-17T23:18:15Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "337c1daf75a6125d1b0b9c1e04ab787a17d89a38",
          "body": "…XPLAIN\n\nLet Go-implemented virtual tables plan and scan more efficiently:\n\n  - VTabFunctionFinder (xFindFunction) lets a module override a SQL\n    function applied to its own columns, dispatched through the shared\n    scalar-UDF trampoline; pair it with (*Conn).OverloadFunction so the\n    name prep\n[…]\n carrying over.\n\nCovered by tests and runnable examples (stmt-explain, vtab-overload,\nvtab-planning); documented in the connection-coverage matrix, the hooks\nguide, and the extensions/pitfalls skills.",
          "is_bot": false,
          "headline": "feat: expose advanced virtual-table authoring helpers and statement E…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-07-17T23:18:07Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "de354892aae56d1004d967731b8cd2f135a77871",
          "body": "Update the modernc.org/sqlite and modernc.org/libc requires in the root\nmodule, and retidy every module that replaces gosqlite.org locally so their\ngo.sum files carry the matching hashes.",
          "is_bot": false,
          "headline": "build: refresh the transpiled SQLite engine and libc dependency",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-07-17T23:17:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "22b0ae620858d024cde60d8e861d98f2aa2717c9",
          "body": "Returns every live object's id in ascending order, so a caller can run an\nexternal referential/orphan sweep — deleting objects no application row still\nreferences — without tracking ids out of band. Includes a test.",
          "is_bot": false,
          "headline": "blobstore: add Store.List to enumerate live object ids",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-07-11T01:56:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b715eeb525247d5d2052c0c4b208aa5010d91df3",
          "body": null,
          "is_bot": false,
          "headline": "release v0.13.0: pin intra-repo gosqlite.org requires to v0.13.0",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-07-03T22:55:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "69b20b9caa1a1abadf64c3af66adc015624edf2d",
          "body": "Implements handling for database connections defined via network DSN\nschemes (e.g., `quicsql://`). The root library no longer depends on\nnetwork packages; instead, it teaches the built-in \"sqlite\" driver how\nto correctly open and route these remote DSNs through external drivers\nusing `RegisterRemoteScheme`.",
          "is_bot": false,
          "headline": "feat: support remote DSNs by dispatching to network backends",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-07-03T22:41:22Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e5538ef5e1cfc1a39f89fd2d07cb28eac6231ca8",
          "body": null,
          "is_bot": false,
          "headline": "release v0.12.0: pin intra-repo gosqlite.org requires to v0.12.0",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-29T01:21:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f40718a90c8c385779dabf120031ba52fdad55b6",
          "body": "`just release` skips the example modules (they are not gosqlite.org/* and are\nnever published), so add a `pin-examples` recipe that bumps every examples/*\nmodule's locally-replaced gosqlite.org require up to a release version — the\nbuild still resolves through the replace, so the require line just r\n[…]\nion folded into vfs/vault) — which survives\nas a transitive dependency of the liteorm dialect, pinned to its last published\ntag and documented in go.mod; it drops out once the dialect migrates off it.",
          "is_bot": false,
          "headline": "examples: add pin-examples recipe and pin replaced gosqlite requires",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-29T01:09:23Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "33e986c9fcff887f38665011f32aac9d24f2139d",
          "body": "A read-only open of an image whose at-rest journal mode is not DELETE (e.g.\nleft in WAL by a prior mounted session) failed: the open setup ran\nPRAGMA journal_mode = DELETE (and auto_vacuum) unconditionally, both header\nwrites that a read-only connection cannot do (SQLITE_READONLY). This broke\nevery \n[…]\nither can nor needs to change them. Add a regression test reopening\na WAL-at-rest image read-only, plaintext and encrypted.\n\nAlso notes vfs.go's auxCryptUnit as the intentional mirror of vfs/crypto's.",
          "is_bot": false,
          "headline": "vfs/vault: skip header-write pragmas on a read-only open",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-27T23:55:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "584564bcec08f06e4d7d75a1920c861d760a2d77",
          "body": "…arial tests\n\n- Symmetric (raw-key) authenticated mode: the on-disk authenticated flag sits\n  in the CRC-checked but unkeyed superblock, so a keyless attacker can clear\n  it; a bare key-only reopen then skips verification. Correct the \"cannot be\n  stripped\" claim in doc.go/options.go — a reopen must\n[…]\n in writeDirectory that segIndex advances before the durable flip, so a\n  failed-then-retried commit leaks the superseded extents for the session\n  (benign, reclaimed on reopen — never a double-free).",
          "is_bot": false,
          "headline": "vfs/vault: harden auth-downgrade contract, keyslot validation, advers…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-27T20:15:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "ada913a289c1497ff9c2e64f56bdd8a9de8bddfd",
          "body": "The all-zero decrypt-skip (a sparse hole reads back as zeros) applies to the\nmain database too, so zeroing a ciphertext page reads back as a valid blank\npage rather than visible corruption. Note this carve-out in the threat model\nso the \"SQLite sees corruption\" claim is accurate; nothing here authen\n[…]\noss\nfile kinds, tamper confined to its own wide-block unit, and an interior hole\nskipped while the surrounding data round-trips. Note the auxCryptUnit\nconstant as an intentional mirror of vfs/vault's.",
          "is_bot": false,
          "headline": "vfs/crypto: document the zeroing tamper case; add aux-unit test matrix",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-27T16:40:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7bb3053ed767f146cddb923aedb6df6593d2b97b",
          "body": "…ta test\n\nConnStore joins a caller-held transaction, so callers can compose it into\ndeadlocks or torn reads. Document the traps on the type: pooled mutators\n(NewVersion/Prune/Clone, pooled Delete/Truncate) grab a second pooled\nconnection and BEGIN IMMEDIATE, so calling them inside an open OnConn tx\n\n[…]\neate/Size) concurrent OnConn test that runs under\n-race — the BLOB-I/O OnConn tests skip -race (the modernc blob path trips\ncheckptr), leaving the transaction-joining path otherwise unexercised there.",
          "is_bot": false,
          "headline": "blobstore: document OnConn composition hazards; add concurrent-metada…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-27T13:05:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "03eab7cc8cf2459451169dd4e7d6283c1562b5ed",
          "body": "- Name the gorm drop-ins consistently as glebarez/sqlite and\n  gorm.io/driver/sqlite across README, guides, skills, and reference;\n  drop the mangled and contracted forms and an un-importable import path.\n- blobio: describe it as blobio.Register(conn) incremental BLOB I/O over\n  columns, not an fs.F\n[…]\nev pointers; complete the extensions catalog.\n- misc: blobstore versions table in the create comment, in-memory driver\n  name, Config wording, examples inventory, unified review dates, CI job\n  names.",
          "is_bot": false,
          "headline": "docs: correct gorm naming, blobio classification, and stale claims",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-27T01:30:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "85fa016e891fd52ccb61d237c588dd71cbe87964",
          "body": "staticcheck/golangci-lint now resolve from PATH or GOPATH/bin, falling\nback to `go run` when neither is installed, so `just lint` no longer\nhard-fails when GOPATH/bin is off a login shell's PATH. Add a\nlint-examples recipe (discovered via a new exmods var) that builds and\nlints the standalone example modules — previously outside submods, so\nthey got no vet/lint/build anywhere; the build writes to a throwaway dir\nso no binaries are left behind.",
          "is_bot": false,
          "headline": "justfile: resolve linters off PATH and lint example modules",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-26T21:10:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a809c8ffcc4d1fd93dbcce4c6691c5805acea7dc",
          "body": "Collapse manual counter loops to range-over-int and an `if x > max`\nclamp to `min(...)` — the findings `gopls modernize` reports. No\nbehaviour change; clears the modernize stage of `just lint`.",
          "is_bot": false,
          "headline": "vfs: modernize range/min idioms in reclaim and bench code",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-26T17:25:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bb81917124401b147744951120cbec5e6184e432",
          "body": "CompactLogicalOnline reclaims a large deletion from an OPEN container in O(live\ndata): it reads SQLite's freelist, drops the dead pages' container slots (no page\nis written, moved, or re-encrypted -- unlike incremental_vacuum, which re-encrypts\nevery page it moves because the cipher tweak is the pag\n[…]\n trunk pages and drops only the leaves, is\nindependent of the inner-db auto_vacuum setting, and the SQLite-format coupling is\none isolated big-endian reader (page-1 header plus the trunk-page layout).",
          "is_bot": false,
          "headline": "vfs/vault: CompactLogicalOnline, O(live) online reclaim via the freelist",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-26T13:50:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f1402fac4f7ef7ac6341f47c6a291076020249a",
          "body": "storePage now stores an all-zero page sparse -- releasing its block and marking\nthe directory entry empty before any encode/encrypt/write -- so a zeroed page\ncosts no block, and a freed region whose directory segments go fully sparse drops\nthem too. It is the \"release block + mark slot sparse\" primi\n[…]\neBytes(path) reports the free-block space a compaction would return.\nCompactOnline gains a progress callback (cumulative bytes reclaimed per batch) so\na long pass can report status and shrink visibly.",
          "is_bot": false,
          "headline": "vfs/vault: sparse-on-write, ReclaimableBytes, CompactOnline progress",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-26T00:15:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d3c3c89aa24917118536666852e4cbb5a49b7f1b",
          "body": "Open put page_size in the DSN, but the driver applies the _pragma flags sorted,\nso auto_vacuum and journal_mode = WAL -- both of which write the database header\n-- ran before page_size and locked SQLite at its default page size while the\ncontainer used the configured one. That mismatch forced a sub-\n[…]\nindexing the container directory. Keep only page_size in the\nDSN and apply auto_vacuum then journal_mode after open, so page_size is pending\nfirst and the container's page size is the one that sticks.",
          "is_bot": false,
          "headline": "vfs/vault: apply page_size before the creation-time pragmas",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-25T20:40:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "64da8355b85c9e985053aec583db2106b25d8e70",
          "body": "…ux encryption\n\nStore the page directory in fixed-size segments under a small segment index, so\na commit re-encodes and re-encrypts only the segments whose pages changed (plus\nthe tiny index) -- the per-commit directory write is O(changed pages), staying\nflat as the image grows instead of getting mo\n[…]\nt dirty, so a\ntruncate-then-grow within one transaction could carry a stale segment forward\nand resurrect the just-dropped pages on reopen -- mark every affected segment so\nthe regrow recomputes them.",
          "is_bot": false,
          "headline": "vfs/vault: segmented page directory, logical/online reclaim, faster a…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-25T16:05:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4e055277ae509141731d4ba64818975d826df4b7",
          "body": "SQLite writes the WAL and rollback journals as frames and records whose headers\n(24 bytes for a WAL frame, 8 for a journal record) never land on a page\nboundary, so aligning the page cipher to the page size turned every such write\ninto a full-page read-modify-write. Encrypt the transient journal/WAL\n[…]\n for sparse interior pages that the\nsmaller unit also needs.\n\nMeasured ~2x faster on a large sequential write in WAL mode; the raw page cipher\nwas never the bottleneck, the aux-file amplification was.",
          "is_bot": false,
          "headline": "vfs/crypto: encrypt transient aux files at a small cipher unit",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-25T13:30:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f7d527c8c290139ce650e34d2076cc311a50fd9c",
          "body": "Store.OnConn(*sql.Conn) returns a handle whose Create / WriteAt / Batch /\nWriteAtFrom / Truncate / Delete / ReadAt / Size run on a connection the caller\nholds, so the content writes join whatever transaction is open on it and commit\natomically with the caller's own rows -- a SQLite transaction is pe\n[…]\nun inside an open transaction).\n\nThe pooled methods and the OnConn methods now share the same transaction bodies\n(writeOnConn, batchOnConn, readOnConn, and friends), so the two paths stay in\nlockstep.",
          "is_bot": false,
          "headline": "blobstore: add Store.OnConn for transaction-joining writes",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-25T01:50:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fa4f72fb2df4d63867c280acb5a851f37c6c6dfb",
          "body": null,
          "is_bot": false,
          "headline": "examples: sync go.mod with the current core",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-24T19:20:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "f7fa8fc0a54f8555982c0826ed47f32ee3e8fa4f",
          "body": "- add a dedicated vault container guide as the home for the storage-mode\n  overview and the full crypto story: recipients, masters and signing writers,\n  authenticated mode, the external rollback anchor, membership enumeration, and\n  encrypted backups, plus online and offline space reclaim\n- scope t\n[…]\nge back to vfs/crypto and the compression page to the\n  storage-mode and level facet, both linking to the vault guide\n- name the vault container in the docs index, the README, and the encryption skill",
          "is_bot": false,
          "headline": "docs: make vfs/vault a first-class page",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-24T15:40:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "070c3fa839c5fca3975ab70ebbc4af4b5545b611",
          "body": "…thorized_keys parsers\n\ncrypto/keyring:\n- capture each recipient's public-key string and optional label; bump the\n  sealed keyslot to a v2 wire format carrying a master-sealed,\n  signature-covered member list\n- add Members to enumerate that membership (master-only) and\n  ParseAuthorizedKeys / ParseA\n[…]\ntrailing free blocks to the OS while the database is open, via a\n  new backing Truncate; it pins the live container across the call and refuses a\n  read-only-recipient container\n\nTests cover all four.",
          "is_bot": false,
          "headline": "vfs/vault, crypto/keyring: add Members, Snapshot, online Trim, and au…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-24T14:15:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4e63c30f2da5a43613661206c0f7e0fcb130d505",
          "body": null,
          "is_bot": false,
          "headline": "release v0.11.0: pin intra-repo gosqlite.org requires to v0.11.0",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T19:51:16Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b872b8f64d5e31b77df78d3e3c6cc1b329aecac",
          "body": "Surface three just-added public symbols where users and agents look, not only in their own Go comments: vfs.AdvisoryLock (interface.go Lock/NoLock docs, vfs/doc.go, the custom-vfs guide + skill, AGENTS.md — which previously told authors to hand-roll the locking the helper now provides); Config.TxLock (configuration guide + AGENTS.md); and blobstore.Compress/Decompress (blobstore guide, doc.go, skill, coverage). Also note the input-aliasing contract on the exported Compress/Decompress.",
          "is_bot": false,
          "headline": "vfs, blobstore: document the newly-added public API",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T19:46:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9436808fe6bcb3434bed4da93d1fed1681468196",
          "body": "Compact called opts.resolveLive() and hard-failed on an out-of-range PageSize/BlockSize, but those fields are ignored — geometry is taken from the source superblock. Open the source with the package defaults (overridden from the superblock anyway), so a stray opts geometry no longer spuriously fails a valid compaction.",
          "is_bot": false,
          "headline": "vfs/vault: drop Compact's unused geometry validation",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T19:46:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "cc5e6f165354c90b0ba6b3d486e309022a6395b3",
          "body": "initIoMethods and initShmIoMethods duplicated the 12 base io-method slots; only the shm table adds FiVersion 2 and the 4 FxShm* slots. Extract baseIoMethods() so both share one definition of the base trampolines — a rename can no longer update one table and silently skip the other.",
          "is_bot": false,
          "headline": "vfs: factor the shared io-methods base table",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T19:46:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4195b140ef996afe130eda909b89b3be27c813e7",
          "body": "Expose the store's chunk codec as Compress/Decompress so a caller can keep tiny objects outside the chunk store (e.g. inlined in its own table row) under the exact same on-disk encoding — verbatim fallback for incompressible input, and a bounded decode as a decompression-bomb guard.",
          "is_bot": false,
          "headline": "blobstore: export Compress/Decompress",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T19:14:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98fecd3526612951a068c66eb5bda26986bb9f3a",
          "body": "Surface the driver's _txlock flag as a typed Config field (deferred/immediate/exclusive): buildDSN emits _txlock when set. IMMEDIATE takes the write lock at BEGIN, so a write-heavy WAL workload queues on busy_timeout instead of failing an upgrade with SQLITE_BUSY_SNAPSHOT. Tested via BuildDSN and an open+transaction round-trip.",
          "is_bot": false,
          "headline": "sqlite: add Config.TxLock for the transaction-lock mode",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T19:14:31Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b9d48e2571d0c0d59a4a44aef370f74dcfe5928f",
          "body": "The vault-blobstore example described its anchorless authenticated config as \"rollback-resistant\"; it is tamper-evident only (rollback resistance needs Options.Anchor). Fixed that in the example's README and header, switched the doc.go examples that set only a key/recipients from .az to a plain path (the extension implied a compression they do not enable), and qualified the snapshot intro that called the input \"the compressed file\".",
          "is_bot": false,
          "headline": "vfs/vault: correct rollback-resistance over-claims and doc nits",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T03:58:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8e042a19b513a0874f0ccd6144cc7257b1f7d3e3",
          "body": "…lock helper\n\nAddress findings from the code audit: Compact now derives its destination geometry and encryption posture from the opened SOURCE rather than the caller's Options — a non-default page size no longer corrupts the copy, and an encrypted source given only Identities is rejected instead of \n[…]\nd clarified the anchor-store and scratch-pool comments.\n\nNew tests cover Compact with non-default geometry, a recipients source given only Identities, a writer-signed source, and the path reservation.",
          "is_bot": false,
          "headline": "vfs, vfs/vault: harden Compact, close the offline-op race, share the …",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T03:52:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dbca21f9b13fde01989e43f402faeae6952ddfd1",
          "body": null,
          "is_bot": false,
          "headline": "examples/liteorm: sync go.mod with the current core",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T03:34:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "64937817fcd35eba22724b9725c5c31735a969f1",
          "body": "Repoint every vfs/compress reference to vfs/vault and lead with vault as a top feature across the README, docs index, the compression and encryption guides, the encryption skill, AGENTS, the keyring/vfs coverage docs, and the example indexes.",
          "is_bot": false,
          "headline": "docs: consolidate the compression and encryption story on vfs/vault",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T03:29:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "def1fa37c48ebff8d86535f63264f73cd92dbba7",
          "body": "Multi-recipient keyslots, masters, and key management now live in vfs/vault, so vfs/crypto returns to its minimal role: a headerless, length-preserving page cipher with a single raw key and no extra files. Drop the keyslot/keymgmt surface and the crypto/keyring dependency, and point recipients users at vfs/vault. The encrypted-blobstore example uses a raw key.",
          "is_bot": false,
          "headline": "vfs/crypto: revert to a plain single-key page cipher",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T03:18:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "95b5301c5f99b67da87d97430c56e4c35016d107",
          "body": "vfs/vault consolidates compression and encryption into one container, so the separate compress module (a duplicate of the same engine plus a codec) is no longer needed. Drop the module, its coverage doc, its features example, and the bench-encryption recipe (bench-vault replaces it).",
          "is_bot": false,
          "headline": "vfs/compress: remove, superseded by vfs/vault",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T03:06:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "659757ea4632a7b28703857e718a5532e52a0376",
          "body": "A block-structured container that stores a SQLite database with compression and encryption as independent options: plain, compressed, encrypted, or both. Live Open queries it in place (durable per transaction, multi-connection, WAL-capable); OpenSnapshot/Pack/Unpack ship it. Encryption is single-key\n[…]\nce on a closed, churned database, continuing the generation so the anchor stays valid.\n\nIncludes a capability-tour example, a multi-recipient blobstore example, a benchmark matrix, and a coverage doc.",
          "is_bot": false,
          "headline": "vfs/vault: add the compression and encryption container",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T02:53:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4d622df14508a3278cc3b279872926b7875e6be5",
          "body": "Use range-over-int and sync.WaitGroup.Go in the concurrency and versioning tests, matching the modernize lint pass.",
          "is_bot": false,
          "headline": "blobstore: modernize test loops",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T02:39:14Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "382d84008b1cdea7e3dc8800319680191bbc6752",
          "body": "Add examples/encrypted-blobstore, an isolated module that runs a blobstore over a vfs/crypto database encrypted to two recipients and confirms no plaintext reaches disk — the encryption model composing onto a blob store, since the store is just SQL and incremental BLOB I/O over a *sqlite.DB. It comp\n[…]\ns) and add its missing Clone, versioning/retention, dedup, and read-only rows; correct the one-line blobstore descriptions in AGENTS, the README, and the guide that still implied a single chunk table.",
          "is_bot": false,
          "headline": "docs: blobstore-over-crypto example and refresh docs for the block model",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T02:31:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "684650ecc201f56a1c4aaf4da8b6de270002f0ee",
          "body": "Document the copy-on-write sharing surface — Clone, NewVersion/ListVersions/OpenVersion, the retention Policy with SetRetention/Prune, WithDedup, OpenReadOnly, and the Stat unique/shared split — in the blobstore guide and skill, and correct the Delete description now that a shared block survives deletion of one holder.",
          "is_bot": false,
          "headline": "docs: blobstore clone, versioning, dedup, and read-only open",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T01:52:47Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "da7601d5d6cbbab1558261f88782c2b75056333f",
          "body": "…d dedup\n\nChunk bytes move from the chunks table into a reference-counted blocks table, with chunks reduced to an (object, seq) -> block mapping. A write resolves a privately-owned block first, copying a shared block before mutating it, so chunks that reference the same block stay independent; Delet\n[…]\ndex so a stale hash can never match changed bytes. OpenReadOnly reattaches to a provisioned store without issuing any DDL and refuses every write, for snapshot browsing or an image on read-only media.",
          "is_bot": false,
          "headline": "blobstore: refcounted copy-on-write blocks with clone, versioning, an…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-23T01:38:14Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "de982dc0c124e0281e5d20c517382f6eb5ffabe6",
          "body": "Beyond a raw Options.Key, Options.Recipients wraps a random data key per recipient (an SSH key, a passphrase, or an age recipient via crypto/keyring) into a detached \"<path>.keyslot\" sidecar, so several parties open one encrypted database with their own Options.Identities and no shared secret. The d\n[…]\nLite file has no per-commit boundary or metadata region for per-slot integrity, and the detached sidecar cannot be re-keyed crash-safely (the database and sidecar are two files with no atomic update).",
          "is_bot": false,
          "headline": "vfs/crypto: multi-recipient encryption via a detached keyslot sidecar",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-22T22:14:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aba89cdc3fb6393c4b6894784518b518dc81554e",
          "body": "…hema upgrade\n\nWriteAtFrom stages reads at the object's frozen chunk size rather than the Store handle's, so re-chunking stays clean when the two differ. Removes the ensureColumn ADD-COLUMN step, which upgraded a schema that never shipped.",
          "is_bot": false,
          "headline": "blobstore: stage WriteAtFrom at the object chunk size; drop unused sc…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-22T19:08:24Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "6b62cba72f01865ae4e640a2614ca019408f0fd1",
          "body": "Extends at-rest encryption beyond a single raw key:\n\n  - Options.Recipients wraps a random data key per recipient (via crypto/keyring)\n    into a keyslot block; Options.Identities unwraps it. Rewrap re-wraps the set\n    and Rekey re-encrypts under a fresh key, both on a closed database.\n  - Options.\n[…]\nain per auxiliary file kind, a pooled per-page extent on the encrypted path, second-opener key/role validation on the shared container, and a benchmark matrix across the compress/encrypt combinations.",
          "is_bot": false,
          "headline": "vfs/compress: multi-recipient, master, and read-only at-rest encryption",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-22T18:31:38Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "62144d2f754d796836cbe044ec8fe0f6bacc771f",
          "body": "NewCipher and DeriveKey route their per-cipher key length through a single exported KeyLen(Cipher), so a layer that builds its own data key (vfs/compress) sizes it from one source instead of repeating the 32/64 constants.",
          "is_bot": false,
          "headline": "vfs/crypto: export KeyLen for downstream data-key sizing",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-22T15:46:12Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "083920402be756d4dc81dec17fe99082644a99d0",
          "body": "…masters\n\nA new module that envelopes a random data key to several recipients — SSH keys, passphrases, or X25519 — so many parties open one encrypted database with their own identity and no shared secret. Master and writer keys (ed25519) sit on top: the keyslot membership is master-signed and pins a\n[…]\n set, the basis for admin-gated membership changes and read-only recipients in the VFS layers. The Recipient/Identity interfaces are sealed, keeping the underlying age types out of the public surface.",
          "is_bot": false,
          "headline": "crypto/keyring: wrap a database data key for multiple recipients and …",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-22T15:27:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e3087f7f6ed808a90a633bae577f8553df8be3b6",
          "body": "Add at-rest encryption to the live compressing VFS via Options.Key (and\nOptions.Cipher). Each compressed block is encrypted after compression — the full\nblock-aligned slot extent, so the wide-block cipher's minimum input is always\nmet — along with the page directory and the passthrough -journal/-wal\n[…]\nned read-modify-write in the passthrough file, the same scheme crypto\nuses, so no transaction's page images hit disk in the clear. Confidentiality at\nrest only, no integrity tag — matching vfs/crypto.",
          "is_bot": false,
          "headline": "vfs/compress: encrypt the database at rest",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-22T14:42:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d1ee64c2f16b359554401091fbf1d91034f557bf",
          "body": "Promote the per-page cipher to a public API so other storage layers can reuse\nit without re-deriving the construction: the pageCipher interface becomes the\nexported PageCipher (Encrypt/Decrypt over a tweak and a domain byte, length\npreserving and concurrency-safe), and newCipher becomes NewCipher. The Adiantum\nand AES-XTS implementations, the serialization mutex, the defensive key copy,\nthe FileKind domain constants, and DeriveKey are unchanged. No behavior change.",
          "is_bot": false,
          "headline": "vfs/crypto: export the page cipher",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-22T14:08:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "8b5efa6fe4382f51b14df7cd76dae4ba76a6a0af",
          "body": "Add Store.Batch(ctx, id, func(w io.WriterAt) error): it runs many writes against\none object in a single transaction, committing them together when the callback\nreturns nil and rolling the whole batch back on an error or panic. This\namortizes the per-write commit (and fsync) for bulk loads and stream\n[…]\nvery commit, so each WriteAt is one\nfsync; NORMAL defers the fsync to checkpoint and stays crash-consistent in WAL\nmode, dropping only transactions committed since the last checkpoint on a power\nloss.",
          "is_bot": false,
          "headline": "blobstore: batched writes and a synchronous=NORMAL recommendation",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-21T03:52:18Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "2962e1d239f72102459bec450ac28a6091653fed",
          "body": "Compressing or decompressing a chunk constructed a fresh lz4/zstd codec each\ntime; the zstd encoder/decoder objects are heavyweight, so streaming a\ncompressed object churned one per chunk and pressured the GC. Borrow a pooled\naz.Encoder/az.Decoder instead — EncodeAll on writes, DecodeAllLimit on rea\n[…]\nration, and DecodeAllLimit keeps the decompression-bomb bound\n(it caps the output instead of materializing a hostile frame).\n\nA concurrent round-trip test exercises both pools under the race detector.",
          "is_bot": false,
          "headline": "blobstore: pool the compression codec",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-21T03:14:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bc68bebea951c48cc1786d4e7a7520548a598674",
          "body": "SetCompression now changes an object's storage mode, not only its level.\nCompressionNone converts a compressed object to raw, and a compressing level\nconverts a raw object to compressed, rewriting every existing chunk into the new\nrepresentation in one transaction; content is preserved, and a level-\n[…]\nong verbatim frame is rejected on decode; and Delete surfaces a\nRowsAffected error instead of treating it as not-found.\n\nDocs and the blob-storage skill drop the stale \"mode frozen at Create\" wording.",
          "is_bot": false,
          "headline": "blobstore: convert objects between raw and compressed modes",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-21T02:37:41Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fff8cc0cdf4e44b3e07edeee75e73510597811ff",
          "body": "WithObjectCompression now freezes a per-object compression level, not just\nthe raw/compressed mode, backed by an additive objects.level column (0 means\n\"use the writing Store's level\", so old objects and the no-override case keep\ntheir exact prior behavior). A small or cold object can be stored at B\n[…]\nred bytes, chunk size,\nmode, level, and the actual at-rest compression ratio, computed on demand\nfrom the stored chunk sizes rather than maintained in a column (always\naccurate, no write-path upkeep).",
          "is_bot": false,
          "headline": "blobstore: per-object compression level, changeable level, and Stat",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-21T01:48:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "621e6a28f03cf81bf51064ab3a67f8b35ed71c0b",
          "body": "The file names had drifted from what they held. compress.go read as the\npackage's primary entry point but contained the snapshot opener, while the\nlive opener sat in live.go. Worse, the container storage engine lived in\nmainfile.go while container.go held the on-disk wire format — a direct\nname/cont\n[…]\nhot mode), vfs.go\n(the live VFS and its Open), container.go (the compressing storage engine),\nformat.go (the on-disk superblock/directory wire format). Tests follow their\nsubjects. No behavior change.",
          "is_bot": false,
          "headline": "vfs/compress: rename source files to match their contents",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-21T01:06:53Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "22030a5fb2ea9315f47a8ea017f472d59de3ded0",
          "body": "… document it\n\nOpen is now the live, queried-in-place mode (the one to reach for) and the\nformer snapshot opener becomes OpenSnapshot; the registered VFS type is now\nVFS (was LiveVFS).\n\nValidate a container's superblock and directory on open before using any\nfield: block and page size must be sane p\n[…]\no fsyncs and its\nfull-directory rewrite as deliberate tradeoffs.\n\nDocument the live mode across the package doc, the compression guide, the\nREADME, and a runnable example that demonstrates both modes.",
          "is_bot": false,
          "headline": "vfs/compress: make Open the live mode, validate untrusted containers,…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-21T00:34:09Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f1eef4c59e75bb8b0ce1080ab7e06b3c603428c4",
          "body": "Split the storage engine into a shared, refcounted container (the page\ndirectory, block allocator, superblock metadata, and backing file) and a\nthin per-connection handle. Connections that open the same canonical path\nshare one container through a process-global registry, so they observe the\nsame co\n[…]\neout so writer contention retries. Coordination is in-process only.\n\nTested with concurrent readers against a writer and with concurrent write\ntransactions that must all land; the suite is race-clean.",
          "is_bot": false,
          "headline": "vfs/compress: support multiple connections on a live compressed database",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-21T00:09:27Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "77d956eb567b9ee320d386bacd0338c6d5e61c99",
          "body": "Open a database that stays compressed on disk and is queried in place,\ndurable per transaction, alongside the existing snapshot Open (which\ninflates to a plaintext working copy and recompresses at Close).\n\nOpenLive registers a pure-Go, file-backed vfs.VFS whose main database is\na block-structured co\n[…]\nAlso bound the snapshot Open's inflation with Options.MaxInflatedSize, so\na crafted compressed file from an untrusted source cannot inflate to an\narbitrarily large working copy (a decompression bomb).",
          "is_bot": false,
          "headline": "vfs/compress: add a live transparent compressing VFS",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T23:44:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0d3d76271d503b5a0f6a43762b1c0a93db3b677d",
          "body": "Pass --config <repo-root>/.golangci.yml explicitly in the CI sub-module\nlint job and the lint-submodules recipe rather than relying on\ngolangci-lint walking up from the sub-module directory to find it.\nResolution can't drift if a sub-module later gains its own config, and\nthe root exclusions apply uniformly across every module.",
          "is_bot": false,
          "headline": "ci, justfile: pin golangci-lint to the repo-root config",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T23:21:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7689b390739ca17284f68aac9cb67e5fcd1c111b",
          "body": null,
          "is_bot": false,
          "headline": "release v0.10.0: pin intra-repo gosqlite.org requires to v0.10.0",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T23:07:41Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5c1de1567c093a426d809e08f680ffa17635918",
          "body": "The root lint job (vet + staticcheck + golangci-lint + modernize) skipped the\nsub-modules, so findings in their own module context — like the modernize one\nthat slipped into vfs/compress — went uncaught. Now each discovered sub-module\nruns the same suite in its own context: the CI `submodules` matri\n[…]\ntays repo-wide in the root job, which already\ncovers every file. golangci-lint runs in the sub-module dir and walks up to the\nrepo-root .golangci.yml, so the exclusions apply uniformly across modules.",
          "is_bot": false,
          "headline": "ci, justfile: lint every sub-module, not just the root",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T22:33:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d95b2c8a6a213167e29ef0895b0c12857176d7b9",
          "body": "Before gating every sub-module through the lint suite, fix what it flags:\n\n- modernize (range-over-int / min): autovacuum_test.go, blobstore (io.go and\n  blobstore_test.go), and the vfs/compress example + tests.\n- errcheck: extend the shared .golangci.yml so its cleanup-path exclusions\n  reach the s\n[…]\nob, *os.File, os.RemoveAll, the az reader/writer) are\n  added to exclude-functions. One unexported-type close in vfs/compress gets an\n  explicit `_ =` instead, since exclude-functions can't target it.",
          "is_bot": false,
          "headline": "lint: clear the findings the per-module gate surfaces",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T22:14:06Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f145403514909f31293ba700a43d1487cd56ce76",
          "body": "New module gosqlite.org/vfs/compress (own go.mod, replace gosqlite.org => ../..,\ncodec dep isolated from the root graph). compress.Open stores a database\ncompressed on disk: it inflates the file into a private temp working copy, opens\nit as a normal *sqlite.DB, and recompresses over the path on Clos\n[…]\nsession is consolidated before compression.\n\nAdds the guide, the encryption-and-vfs skill section, README / index / AGENTS\nentries, the coverage matrix, and the runnable example with a pointer README.",
          "is_bot": false,
          "headline": "vfs/compress: compressed databases at rest (snapshot model)",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T21:39:51Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "32ff14527ebf70154432530e13513de0664d75ae",
          "body": "The v0.9.0 release verified each module with `go build` but not `go mod tidy`,\nso their go.mod was missing the indirect module-graph entries the local\n`replace gosqlite.org => ..` pulls in (golang.org/x/sync, golang.org/x/tools)\nand their go.sum was incomplete. Tidy records them and completes go.sum. Neither\ndep is compiled into the packages (`go mod why`: main module does not need them)\n— they are module-graph metadata only.",
          "is_bot": false,
          "headline": "blobstore, vfs/crypto: go mod tidy",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T21:08:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "5cee123ec74cff7a73b066d93439078181c38224",
          "body": null,
          "is_bot": false,
          "headline": "release v0.9.0: pin intra-repo gosqlite.org requires to v0.9.0",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-19T19:03:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "848d457a130aebb21cda73e8b388a01e4cf1353f",
          "body": "…sion pin guard\n\nThe justfile and CI no longer hand-list the sub-modules. just derives them from\ntheir go.mod — submods (every joined module) and pubmods (the published\ngosqlite.org/* ones) — and loops build / test / cross-build over them; CI\ndiscovers the same set and fans a test matrix over it, re\n[…]\nlike it\nvanished from `go get`. The release recipe keeps them in lockstep by\nconstruction. The check uses portable shell (no bash-4 associative arrays) so it\nbehaves the same on the dev box and in CI.",
          "is_bot": false,
          "headline": "build: discover sub-modules in just/CI loops; add a lockstep core-ver…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T20:31:58Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "cddf77d9e46a8db5c247fc9ef23428aae555b6b3",
          "body": "…crypto-free\n\nThe root package no longer imports the encrypting VFS. Removed Config.Encryption\n(and the Cipher / Adiantum / AES-XTS re-exports) and DB.VFSName, and added a\ngeneric Config.VFSCloser io.Closer that DB.Close drains after the pool — so any\nVFS-providing module can bundle its teardown int\n[…]\nntalVacuum).\n\nDocs, skills, and examples shift to crypto.Open and describe the module family\naccurately: the core gosqlite.org module plus the opt-in vfs/crypto, blobstore,\nand gorm companion modules.",
          "is_bot": false,
          "headline": "crypto: extract vfs/crypto into its own module; make the root driver …",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T20:09:13Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "abea4962c0bd45d0a9180244bef885a45f13c9d7",
          "body": "…mpression\n\nA growable, randomly-writable byte-object store on SQLite (io.ReaderAt /\nio.WriterAt, sparse holes, truncate, conn-per-op via OpenBlob). It lives in its\nown module (gosqlite.org/blobstore, replace gosqlite.org => ..) so its codec\ndependency never enters the root graph; the root package d\n[…]\n path avoids OpenBlob so it runs under the race detector.\n\nDocs, the skill, the coverage note, and the runnable example land with the\nmodule; blob.go and ext/blobio point growable-stream callers here.",
          "is_bot": false,
          "headline": "blobstore: extract into its own module; add transparent per-object co…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T19:22:47Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3c141824d91d279b0f57acaec897895c534e584a",
          "body": "…-tree gorm package",
          "is_bot": false,
          "headline": "gorm: require gosqlite.org v0.8.0 — first core release without the in…",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-19T01:58:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9e8337f7a889d456e0cd07b5665d71ee464a2f3",
          "body": null,
          "is_bot": false,
          "headline": "ci / vfs / doc: inconsistency fixes",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-19T00:16:27Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "46c8ce1a2b25af066e2448b2f00e3ed2f4798818",
          "body": "ORM companion; reframe gorm as a separate dialector module",
          "is_bot": false,
          "headline": "README + docs + skills: introduce LiteORM as the declarative-search",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T15:21:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "92ff675e214b1698a6a3f7995c1c4f664c499df1",
          "body": "ext/regexp/gorm tag-driven bridges\n\ngorm/ moves to its own go.mod under the gosqlite.org/gorm path so the\nmain module no longer carries gorm.io/gorm + its transitive deps in\nits dependency graph. Downstream consumers who don't use gorm stop\npaying for it on go mod tidy; consumers who do use it pull\n\n[…]\nexamples/crypto/ replaces the deleted\nexamples/gorm-crypto. The renamed examples drive composition with\nvec / fts / ext / vfs / crypto from the gorm side — every recipe\nthat worked before still works.",
          "is_bot": false,
          "headline": "extract gorm/ into its own sub-module; drop vec/gorm + fts/gorm +",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T13:32:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0285ca2739e5275bffae05de78627273fbd2c03a",
          "body": "ddlmod → ddl rename\n\nxorm-compat/ ships as its own go.mod with `replace gosqlite.org =>\n..` so the xorm.io/xorm dependency stays out of the main module's\ngraph — downstream consumers never see it. The repo-root `go build\n./...` / `go test ./...` skip the directory because it is a separate\nmodule; a \n[…]\ne existing\ngorm- / mattn- / modernc-upstream lanes. docs/guides/migrating.md\ngrows the xorm drop-in recipe; docs/reference/driver-names.md,\ndocs/index.md, and README.md absorb the matching one-liners.",
          "is_bot": false,
          "headline": "xorm-compat/: isolated module + gorm/ drop sqlite_version probe +",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T13:32:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4a19765785dd316aefda5688eeaa3c382b967977",
          "body": null,
          "is_bot": false,
          "headline": "enforce memory barrier in shared-memory vfs",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-20T10:37:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "e8b9c9d1e523a63b87fe1eb7d4dd01f1355a5c91",
          "body": null,
          "is_bot": false,
          "headline": "Fix LICENSE",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-15T19:38:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "df555557348cc74c113aae6a2f08f50ccf44a056",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-19T23:42:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "83441e7a94bfd868937f717d765a4adb7bd2d0c9",
          "body": "Module path moves to the vanity import gosqlite.org. go.mod's module\nline, every internal `import \"github.com/go-again/sqlite/...\"` across\nthe root + 12 sub-packages (gorm, vec, vec/gorm, fts, fts/gorm,\nfusion, vfs / vfs/{crypto,cksm,mvcc,memdb}, internal/* and ext/*),\nevery example, every test, eve\n[…]\nm/go-again/sqlite path stops resolving and the\ndocs in dev/upstream/{gorm,mattn,modernc}.md gain a one-line\n\"renamed from …\" pointer so downstreams who land here from search\nknow which import to swap.",
          "is_bot": false,
          "headline": "rename module path: github.com/go-again/sqlite → gosqlite.org",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-19T20:44:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "b5c111e6a398ca7544130fdc3633eabfc044dec4",
          "body": null,
          "is_bot": false,
          "headline": "Update README.md",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-19T18:50:00Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "106fb52caf65bd77af163cae26fce2e8321a43dc",
          "body": "+ skills/\n\nThe old flat docs/ tree mixed two audiences: maintainer reference\n(coverage matrices, upstream-suite recipes, perf baselines) and\nconsumer-facing walkthroughs that never existed. Maintainer reference\nmoves under dev/: dev/coverage/{conn,ext,fts,gorm,session,sql,vec,\nvfs}.md + dev/upstream\n[…]\ngorm / vec /\nvec/gorm, and every upstream-suite test file's \"see dev/...\" link\nget pointed at the new paths; the ci.yml lane comments rewire to\ndev/coverage/sql.md and dev/upstream/{modernc,mattn}.md.",
          "is_bot": false,
          "headline": "docs/: split maintainer reference (dev/) from consumer site (docs/)",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-19T17:08:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "9c4a5afdfa5eb23aa7802978543256c41f682c58",
          "body": "hierarchy\n\nThe flat examples/ tree (where everything was a sibling of everything\nelse, prefixed by ext-/gorm-/fts-/vfs- to fake categorisation) moves\nto a real hierarchy: examples/getting-started/ for the three opens\n(database-sql, config, gorm) with a new database-sql entry for\nabsolute beginners; \n[…]\ns.txt, llms-full.txt, docs/coverage-{fts,gorm,session,\nvec,vfs}.md, docs/mattn-upstream.md, and the per-package doc.go in\nfts / fts/gorm / fusion / gorm / vec / vec/gorm / vfs / vfs/cksm /\nvfs/crypto.",
          "is_bot": false,
          "headline": "examples/: reorganize into getting-started / migrating / features",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-18T20:59:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8c742995cad639b28a2ac18967b19dc1d938461b",
          "body": "domain/id + ext/csv skip + pcache: bounded LRU page-cache extension\n\nFour new ext sub-packages land. ext/decimal exposes shared-precision\nbig-decimal arithmetic as a family of SQL scalars: decimal /\ndecimal_add / decimal_sub / decimal_mul / decimal_div / decimal_cmp /\ndecimal_neg / decimal_abs / dec\n[…]\nrates\nthe install + telemetry loop. pcache/doc.go documents the\nprocess-global nature of the install (the methods2 vtable is\nprocess-wide, so there can only be one InstallBoundedLRU active at\na time).",
          "is_bot": false,
          "headline": "ext/{decimal,money,time,eval} + ext/fuzzy caverphone + ext/uuid v2",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-18T19:22:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "76da59ba31ed449aae3d729a8e4f86b888194806",
          "body": "observability Wrap(base, Recorder)\n\nvfs/interface.go grows an optional ShmFile capability interface: a\nFile that implements it advertises WAL support by returning a\nnon-empty ShmGroup() key, and the dispatcher routes every File with\nthe same key to one shared in-process shm region. A File that does\n\n[…]\n shape; consumers\nplug any custom Recorder for metrics / tracing. Wrap composes\ncleanly: a chain like Wrap(Wrap(base, metrics), trace) layers two\nrecorders without each having to know about the other.",
          "is_bot": false,
          "headline": "vfs/: WAL shared-memory via ShmFile capability +",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-18T17:41:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8ebd41203365b634bd52258844a371131fedab72",
          "body": "vfs/ grows a second surface alongside the existing fs.FS / ReaderAt\nadapters: a public VFS / File interface pair plus vfs.Register(name,\nimpl) that drives any Go implementation through one shared set of\ngeneric io-method trampolines. VFS covers Open / Delete / Access /\nFullPathname; File covers Read\n[…]\n dispatch into a Go interface instead of\ninto hand-written io-methods tables — vfs/register.go owns the\nregistry + xOpen, vfs/iomethods.go owns the 12 trampolines, vfs/\nerrors.go owns the typed error.",
          "is_bot": false,
          "headline": "vfs/: user-implementable VFS interface + generic dispatcher",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-17T20:18:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "015e15d46ab42f6da19dcddc5e237245c0526300",
          "body": "needed / ext-fuzzy / fts-tokenizer / fts-vocab / udf-context /\nvec-keyed) + extend ext-hash, gorm-vec-tagged, sqlitex, vec-search\n\nSeven new examples land, one per recent landing. busy-handler\ndemonstrates (*Conn).RegisterBusyHandler with retry-and-give-up\nsemantics; collation-needed shows the lazy-\n[…]\nposes the new string-similarity scalars (Levenshtein,\nDamerau-Levenshtein, Jaro-Winkler, Soundex). vec-keyed shows\nCreateKeyed[string] / Insert / KNN with a user-supplied key column\nrather than rowid.",
          "is_bot": false,
          "headline": "examples: cover the round's new surfaces (busy-handler / collation-",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-17T18:33:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "6126352ca6f5462b939d60656e7b62b505ed2986",
          "body": "ext/fuzzy adds six string-similarity functions for ad-hoc fuzzy\nmatching without reaching for ext/spellfix1's vtab: levenshtein(a,\nb) and damerau_levenshtein(a, b) return integer edit distance\n(Damerau adds adjacent-transposition as a single op);\nhamming(a, b) returns the per-character mismatch coun\n[…]\nt known vectors —\n\"kitten\"/\"sitting\"=3, \"robert\"/\"robbert\" transposition vs\nnon-transposition under D-L, the canonical Winkler-bonus pairs,\nclassic Soundex outputs (\"Robert\" → R163, \"Pfister\" → P236).",
          "is_bot": false,
          "headline": "ext/fuzzy: string-similarity SQL scalars",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-17T16:55:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "4b018abea015140128b2c01bef6f9ab35e5a6e9f",
          "body": "vec.KeyedTable[string]\n\nvec/gorm grows a second PK mode alongside the existing integer/rowid\npath. The plugin's registerSchema decides at schema-parse time: an\ninteger PK keeps the rowid path with KeyColumn=\"rowid\"; any other\ntype (typically string UUIDs / ULIDs / KSUIDs) sets KeyIsText=true,\nKeyCol\n[…]\nrm/stringkey_test.go pins the string-PK round-trip: Create a\nmodel with a `gorm:\"primaryKey\"` string field and a vec-tagged\nembedding, AutoMigrate, Create rows, KNN by query vector, DropTable\ncascade.",
          "is_bot": false,
          "headline": "vec/gorm: support string-PK models by routing through",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-16T21:02:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dadcb399bd8635794e9b3da6fe0db94438a749a7",
          "body": "ext/hash gains blake3(data, size?) and xxh64(data). BLAKE3 is the\nextendable-output function — size is the digest length in BYTES\n(default 32 = 256 bits, accepted range [1, 1<<20]); the 32-byte case\nfast-paths through blake3.Sum256, longer outputs go through the\nhasher with Sum reading size bytes. x\n[…]\n crypto.Hash.Available() gate the\nother digests do — they always register. blake3_xxhash_test.go pins\nthe known-vector round-trip for both, plus the size argument and\nout-of-range rejection on blake3.",
          "is_bot": false,
          "headline": "ext/hash: blake3 + xxh64 SQL functions",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-16T19:10:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e9d74394784fbe7474af4dcefa053d12959452d3",
          "body": "user-supplied key column\n\nbusy.go exposes sqlite3_busy_handler as (*Conn).RegisterBusyHandler(\nhandler BusyHandler). BusyHandler is the typed Go shape — called with\nthe retry count, returns true to retry / false to give up — and the\ntrampoline routes back through the per-conn id registry so the\nclos\n[…]\nhaped consumer code. vec/keyed_test.go pins create /\nbatch insert / KNN round-trip across two key types; vec/table.go\nabsorbs the small follow-up so Table and KeyedTable share the\ncommon SQL emitters.",
          "is_bot": false,
          "headline": "(*Conn).RegisterBusyHandler + vec.KeyedTable[K] typed handle with",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-16T17:27:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c6528146a96be5021283b5033fa8757b7167dcda",
          "body": "helpers + fts.Vocab handle + maintenance / InitialToken / ColumnSet\n+ ext/stats regr_json subtype tag\n\nruntime.go exposes the SQLite C-API functions that aren't connection-\nscoped as package-level helpers: KeywordCount / KeywordName /\nIsKeyword (the authoritative reserved-word enumeration for\nidenti\n[…]\nthe prior round, so downstream json_extract / -> /\n->> see the value as already-parsed JSON and skip a re-parse. The\nsmall ext/stats/stats_test.go addition pins the subtype tag survives\nto the result.",
          "is_bot": false,
          "headline": "runtime.go process-global C-API + six new (*Conn) introspection",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-15T20:35:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "df773a056e61249b7baf00c70c3153a5b3b095ab",
          "body": "interface\n\nfts5_tokenizer.go exposes the FTS5 fts5_api.xCreateTokenizer surface\nas RegisterFTS5Tokenizer(name, newTokenizer) on (*Conn). Implementers\nsatisfy a single FTS5Tokenizer interface — Tokenize(text, emit) where\nemit(token, start, end) writes each token and its source-byte span\ninto FTS5's x\n[…]\nd\nvec/quantize_test.go gain matching coverage rows. collation_needed_\ntest.go and function_context_test.go pick up the corresponding\nsibling pins for the CollationNeeded / aux-data / subtype surfaces.",
          "is_bot": false,
          "headline": "(*Conn).RegisterFTS5Tokenizer: typed Go FTS5 custom tokenizer",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-15T18:48:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f2835f4d5c9b765eac204fd7f110624ce9322341",
          "body": "vec/ hamming + int8 quantized encoding; sqlitex.Execute + plural\nResult helpers\n\ncollation_needed.go exposes sqlite3_collation_needed as\n(*Conn).CollationNeeded(fn) and the convenience AnyCollationNeeded()\nthat registers a no-op so SQLite stops issuing the warning when an\nunknown collation is refere\n[…]\nStrings and ResultInts join the\nexisting scalar ResultInt / ResultText / ResultFloat / ResultBool\nhelpers as their plural single-column counterparts so\n\"SELECT name FROM users\" → []string is one call.",
          "is_bot": false,
          "headline": "UDF aux surface: CollationNeeded / Result+Value Subtype / Aux Data;",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-15T17:12:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "8645b7d78a1c642a5de0bf740bc7832ca689106a",
          "body": "vtab xCreate NOMEM cleanup + drift-discipline doc tightens\n\nfts/tokenizer.go gains wrapTokenize (doubles embedded single quotes\non top of quoteFTSArg's double-quote escape, closing the outer\nstring-literal breakout the tokenize= option permitted) and\nvalidateTokenizer (rejects NUL bytes in any calle\n[…]\nath; SQLite never gets a sqlite3_vtab handle\nto drive xDestroy against on that branch, so without the explicit\nrelease the Go-side Table (with whatever shadow tables / handles\nCreate allocated) leaks.",
          "is_bot": false,
          "headline": "NUL-byte safety on SQL emission + pre-update accessor rc-honest +",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-12T20:08:11Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "53f964738ed36107027a3be64d8ca9198274f8bf",
          "body": "hardens version-prefix parse\n\nvtabx.Create and vtabx.Drop grow a label string argument so error\nmessages name the caller's package even when the SQL module name\ndiffers from it — closure registers as `transitive_closure`, rtree's\nmodule suffix encodes its coord type, etc. Each adopter\n(ext/{bloom,cl\n[…]\nrifying the\nflag actually unlocks sqlite_master writes; session_test.go,\next/{bloom,csv,series,text}/*_test.go and ext/series/series_test.go\npick up matching coverage for the recently-landed surfaces.",
          "is_bot": false,
          "headline": "vtabx.{Create,Drop}: add label arg + sqlitex.parseMigrationName",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-12T17:42:49Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f52c36fe2f2f5dc6b1db105938a02679a0cc11f6",
          "body": "registry + CREATE-VIRTUAL-TABLE skeleton\n\ncallback_table.go lifts the {sync.RWMutex, map[uintptr]T, idGen}\nshape every per-conn C-callback registry rolled by hand into a\ngeneric callbackTable[T] with register / lookup / drop methods.\nregister mints a fresh id off the embedded idGen; drop reclaims it\n[…]\nif-not-exists flag, and the\nsentinel error; vtabx.Drop covers the matching DROP TABLE IF EXISTS\ntear-down. The bare `USING module` form (no parens) is handled so\nspellfix1 fits without a special case.",
          "is_bot": false,
          "headline": "callback_table.go + internal/vtabx: consolidate per-conn callback",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-11T21:37:19Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "bdc112a8b988b7caabfc61e49dcf83df5a1ecc80",
          "body": "progress/WAL + sqlid.QuoteString + examples / tests for the recent\ntyped APIs\n\ndocs/coverage-conn.md is the new home for the (*Conn) / (*Stmt)\ntyped methods that bind SQLite C-API surface beyond database/sql\n(introspection / WAL / snapshot / progress / db-config). Each row\nnames the Go method, the u\n[…]\n_test; ext/{bloom,csv,encode,series,text}\ngain matching test pins. ext/series/cursor.go, ext/text/text.go, and\nthe tiny ext/spellfix1 corrections absorb the small follow-ups\nsurfaced by the new tests.",
          "is_bot": false,
          "headline": "docs/coverage-conn.md + per-conn registry drain extends to rtree/",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-11T21:23:02Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0c850c243957746c21868ad124705404a77c78eb",
          "body": "+ ext/{series,text,encode}\n\nsnapshot.go exposes the SQLite snapshot API as typed methods on the\nconnection: GetSnapshot(schema) captures a read-only handle to the\ncurrent state of a WAL DB, OpenSnapshot(schema, snap) starts a read\ntransaction at that snapshot, SnapshotRecover(schema) re-establishes\n\n[…]\n single-value queries.\nsqlitex/migrate_test.go pins discovery + apply + idempotency;\nsqlitex/sqlitex_test.go pins Save/Transaction/ExecScript/Result*.\ndocs/coverage-ext.md adds the three new ext rows.",
          "is_bot": false,
          "headline": "(*Conn) snapshot / WAL / progress / db-config API + sqlitex helpers",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-10T19:34:44Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0cb4c43a887c59f1f2d9fd37020f44712f9dd981",
          "body": "session.go exposes SQLite's SESSION extension (compiled into the\ntranspiled lib but unexposed by modernc) as a typed Go API.\n(*Conn).CreateSession(schema) → *Session; (*Session) carries Attach\n(empty string = all tables), Enable/IsEnabled/IsEmpty, Changeset()\nand Patchset() to serialize, Diff(fromSc\n[…]\nws two matching\nper-stmt getters: (*stmt).Readonly() wraps sqlite3_stmt_readonly\nfor routing reads vs writes, (*stmt).Status(op StmtStatus, reset)\nwraps sqlite3_stmt_status for per-statement counters.",
          "is_bot": false,
          "headline": "SESSION extension typed API + per-conn/stmt introspection getters",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-10T16:04:50Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "aac3d2fb30b0a038309f4afbe7a574ae0100d065",
          "body": "NUL-safe UDF text path\n\nrtree.go exposes SQLite's R-Tree custom-geometry and custom-query\ncallback APIs as typed (*Conn) methods: RegisterRTreeGeometry(name,\nfn) wraps sqlite3_rtree_geometry_callback for the simple \"does this\nbox overlap?\" shape, RegisterRTreeQuery(name, fn) wraps\nsqlite3_rtree_quer\n[…]\ncompat_test.go grows TestRegisterFunc_EmbeddedNUL\nto pin both the input and round-trip directions. CLAUDE.md / README.md\n/ docs/coverage-ext.md / llms.txt / llms-full.txt pick up the rtree\nfollow-ups.",
          "is_bot": false,
          "headline": "R-Tree custom-geometry/query callbacks + ext/rtree typed handle +",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-09T19:58:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c675d8d30bd3b1a939e29f8345062fdd6950f85d",
          "body": "(*Conn).OpenBlob and (*conn).loadExtension allocate the ppBlob /\nppErrMsg output slot via c.malloc(ptrSize) instead of taking the\naddress of a Go stack variable as uintptr. A Go stack address passed\nas untracked uintptr can go stale when the runtime moves the stack\n— likely when OpenBlob runs reentr\n[…]\nnBlob's behaviour from\ninside a registered UDF.\n\nmodernc.org/sqlite bump; golang.org/x/{crypto,text,sys} carry along\nvia go mod tidy. modernc.org/libc stays on the version the new\nsqlite release pins.",
          "is_bot": false,
          "headline": "blob/extension: output pointer slots live in C memory; dep bump",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-09T18:47:05Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "25870c842fe950dd6c03b2fa247545586180df43",
          "body": "csv, lines (mirroring spellfix1.Vocab + vec.Table + fts.Index)\n\next/bloom adds Filter: Create(ctx, db, name, opts...) /\nOpen(db, name) / Add / AddMany / Contains / Drop with WithSize /\nWithFalsePositiveRate / WithHashes / WithIfNotExists. ext/closure\nadds Graph: Create(ctx, db, name, over, opts...) \n[…]\nI\naddition on each affected row and adds explainer paragraphs for csv\n+ lines; gorm/doc.go picks up a matching cross-reference; llms.txt\n  updates the one-liners; CLAUDE.md picks up a small follow-up.",
          "is_bot": false,
          "headline": "ext: typed Filter / Graph / Table handles for bloom, closure,",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-08T17:48:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "d91ffb45ee48cb3ee8954b7c60c03980fdc3fb8b",
          "body": "ext/spellfix1/vocab.go lifts the raw-SQL-only vtab into a typed handle\nthat follows the same shape as vec.Table and fts.Index, so callers\ncan build / fill / query / drop a vocabulary without hand-written\nSQL. The constructor pair is Create(ctx, db, name, opts...) with\nWithIfNotExists for idempotent \n[…]\nhree typed extensions share one shape across the module.\ndocs/coverage-ext.md updates the spellfix1 row (LoC bumped, dedup\nnote added, second test pin cited); llms.txt picks up the matching\none-liner.",
          "is_bot": false,
          "headline": "spellfix1: typed Vocab API mirroring vec.Table / fts.Index",
          "author_name": "ditalini",
          "author_login": "ditalini",
          "committed_at": "2026-06-08T16:41:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        }
      ],
      "releases_count": 10,
      "commits_last_year": 158,
      "latest_release_at": "2026-07-18T17:31:40Z",
      "latest_release_tag": "v0.14.0",
      "releases_from_tags": false,
      "days_since_last_push": 9,
      "active_weeks_last_year": 12,
      "days_since_latest_release": 9,
      "mean_days_between_releases": 5.9
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "gosqlite.org",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": null,
          "registry_url": "https://pkg.go.dev/gosqlite.org",
          "is_deprecated": false,
          "latest_version": "v0.14.0",
          "repository_url": null,
          "versions_count": 16,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T16:35:41Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        },
        {
          "name": "gosqlite.org/gorm",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": null,
          "registry_url": "https://pkg.go.dev/gosqlite.org/gorm",
          "is_deprecated": false,
          "latest_version": "v0.14.0",
          "repository_url": null,
          "versions_count": 7,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T16:35:41Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        },
        {
          "name": "gosqlite.org/blobstore",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "go",
          "matches_repo": null,
          "registry_url": "https://pkg.go.dev/gosqlite.org/blobstore",
          "is_deprecated": false,
          "latest_version": "v0.14.0",
          "repository_url": null,
          "versions_count": 6,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": null,
          "latest_published_at": "2026-07-18T16:35:41Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 9
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 3,
      "watchers": 0,
      "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": [
        "example",
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [
        "justfile"
      ],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [
        "blobstore/go.mod",
        "crypto/keyring/go.mod",
        "examples/encrypted-blobstore/go.mod",
        "examples/liteorm/go.mod",
        "examples/vault-blobstore/go.mod",
        "go.mod",
        "gorm/go.mod",
        "vfs/crypto/go.mod",
        "vfs/vault/go.mod",
        "xorm-compat/go.mod"
      ],
      "largest_source_bytes": 42041,
      "source_files_sampled": 517,
      "oversized_source_files": 0,
      "agent_instruction_files": [
        "AGENTS.md",
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 20693
    },
    "dependencies": {
      "manifests": [
        "blobstore/go.mod",
        "go.mod",
        "gorm/go.mod",
        "xorm-compat/go.mod"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "go"
      ],
      "dependencies": [
        {
          "name": "github.com/go-again/az",
          "manifest": "blobstore/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.4.0"
        },
        {
          "name": "gosqlite.org",
          "manifest": "blobstore/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.14.0"
        },
        {
          "name": "github.com/cespare/xxhash/v2",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v2.3.0"
        },
        {
          "name": "github.com/google/uuid",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.6.0"
        },
        {
          "name": "golang.org/x/crypto",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.53.0"
        },
        {
          "name": "golang.org/x/text",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.38.0"
        },
        {
          "name": "lukechampine.com/blake3",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.4.1"
        },
        {
          "name": "modernc.org/libc",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.74.1"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.54.0"
        },
        {
          "name": "gorm.io/gorm",
          "manifest": "gorm/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.31.1"
        },
        {
          "name": "gosqlite.org",
          "manifest": "gorm/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.14.0"
        },
        {
          "name": "modernc.org/sqlite",
          "manifest": "gorm/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.54.0"
        },
        {
          "name": "gosqlite.org",
          "manifest": "xorm-compat/go.mod",
          "ecosystem": "go",
          "version_constraint": "v0.0.0"
        },
        {
          "name": "xorm.io/xorm",
          "manifest": "xorm-compat/go.mod",
          "ecosystem": "go",
          "version_constraint": "v1.3.11"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 0,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "ditalini",
          "commits": 118,
          "avatar_url": "https://avatars.githubusercontent.com/u/209022222?v=4"
        },
        {
          "type": "User",
          "login": "arthurpro",
          "commits": 40,
          "avatar_url": "https://avatars.githubusercontent.com/u/8511470?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.747
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        ".golangci.yml"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "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": null,
            "reason": "no pull request found",
            "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/30 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 10,
            "reason": "project has 4 contributing companies or organizations",
            "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": 10,
            "reason": "project is 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": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "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": "no SAST tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 0,
            "reason": "18 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "5ebbe8b29aac7ec97acb16c1ec09bb27c7295af3",
        "ran_at": "2026-07-28T05:47:44Z",
        "aggregate_score": 3.1,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-18T17:13:02Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": null,
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/go-again/sqlite",
    "host": "github.com",
    "name": "sqlite",
    "owner": "go-again"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 53,
      "inputs": {
        "security": 31,
        "vitality": 73,
        "community": 26,
        "governance": 40,
        "engineering": 88
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 73,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "commits_last_year": 158,
              "human_commit_share": 1,
              "days_since_last_push": 9,
              "active_weeks_last_year": 12
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 9 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "12/52 weeks with commits",
                "points": 8.3,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 12
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "158 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 158
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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": 10,
              "latest_release_tag": "v0.14.0",
              "releases_from_tags": false,
              "days_since_latest_release": 9,
              "mean_days_between_releases": 5.9
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "10 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 10
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 9 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~5.9 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 5.9
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 26,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 5,
            "inputs": {
              "forks": 0,
              "stars": 3,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "3 stars",
                "points": 4.9,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "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 (Apache-2.0)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "Apache-2.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": "at_risk",
        "name": "Sustainability & Governance",
        "value": 40,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 27,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.747
            },
            "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 75% of commits",
                "points": 5.7,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 75
                    }
                  }
                ],
                "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 4 contributing companies or organizations",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "critical",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution",
                    "pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 1,
            "inputs": {
              "merged_prs": 0,
              "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": "no decided pull requests or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_decided_prs_or_data",
                    "params": {}
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 45,
            "inputs": {
              "followers": 0,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "go-again",
              "public_repos": 12,
              "account_age_days": 1307
            },
            "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": "0 followers of go-again",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 0,
                      "login": "go-again"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "12 public repos, account ~3 yr old",
                "points": 15.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 12
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 3
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "gosqlite.org",
                "gosqlite.org/gorm",
                "gosqlite.org/blobstore"
              ],
              "ecosystems": "go",
              "any_deprecated": false,
              "min_days_since_publish": 9
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "3 package(s) on go",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 3,
                      "ecosystems": "go"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 9 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 9
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "16 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 16
                    }
                  }
                ],
                "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": "excellent",
        "name": "Engineering Quality",
        "value": 88,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "good",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "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": ".golangci.yml",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "topics": [
                "golang",
                "sqlite"
              ],
              "has_wiki": true,
              "homepage": "https://gosqlite.com",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://gosqlite.com",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "2 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 31,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "at_risk",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging, Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests",
                    "packaging",
                    "signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 31,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 15,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 3,
              "scorecard_aggregate": 3.1
            },
            "components": [
              {
                "key": "binary_artifacts",
                "name": "Binary-Artifacts",
                "detail": "no binaries found in the repo",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "branch_protection",
                "name": "Branch-Protection",
                "detail": "branch protection not enabled on development/release branches",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "ci_tests",
                "name": "CI-Tests",
                "detail": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 4 contributing companies or organizations",
                "points": 2.5,
                "status": "met",
                "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 fuzzed",
                "points": 5,
                "status": "met",
                "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": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "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": "no SAST tool detected",
                "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": "18 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 75,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 85,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.87,
              "agent_instruction_files": [
                "AGENTS.md",
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 20693
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md, CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md, CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "87 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 87,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "good",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 72,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "go.sum"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [
                "justfile"
              ],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 0,
              "toolchain_manifests": [
                "blobstore/go.mod",
                "crypto/keyring/go.mod",
                "examples/encrypted-blobstore/go.mod",
                "examples/liteorm/go.mod",
                "examples/vault-blobstore/go.mod",
                "go.mod",
                "gorm/go.mod",
                "vfs/crypto/go.mod",
                "vfs/vault/go.mod",
                "xorm-compat/go.mod"
              ],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": "justfile",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "justfile"
                    }
                  }
                ],
                "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": ".golangci.yml",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": ".golangci.yml"
                    }
                  }
                ],
                "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": "no agent-authored commits among the last 100",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_authored_commits",
                    "params": {
                      "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": 42041,
              "source_files_sampled": 517,
              "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/517 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 517,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "example",
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "example, examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "example, examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-28T05:47:48.654669Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/g/go-again/sqlite.svg",
  "full_name": "go-again/sqlite",
  "license_state": "standard",
  "license_spdx": "Apache-2.0"
}

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

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

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