Звіт у форматі 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"
}