Звіт у форматі JSON машиночитний
{
"data": {
"repo": {
"topics": [
"embedded-database",
"golang",
"graph-database",
"graphdb",
"quadstore",
"sqlite"
],
"is_fork": false,
"size_kb": 627,
"has_wiki": false,
"homepage": null,
"languages": {
"Go": 465841,
"Shell": 5237
},
"pushed_at": "2026-06-06T14:46:17Z",
"created_at": "2026-04-13T14:46:00Z",
"owner_type": "User",
"updated_at": "2026-05-15T15:11:38Z",
"description": "Single-node graph database for Go applications. Pure Go, embedded, SQLite-backed. Quad model with enforced label namespaces.",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": null,
"name": null,
"type": "User",
"login": "dukkandcards",
"company": null,
"location": null,
"followers": 0,
"avatar_url": "https://avatars.githubusercontent.com/u/255067640?v=4",
"created_at": "2026-01-15T07:19:35Z",
"is_verified": null,
"public_repos": 1,
"account_age_days": 192
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.2.4",
"kind": "patch",
"published_at": "2026-05-15T15:11:32Z"
},
{
"tag": "v0.2.3",
"kind": "patch",
"published_at": "2026-05-07T15:21:18Z"
},
{
"tag": "v0.2.2",
"kind": "patch",
"published_at": "2026-05-06T08:32:20Z"
},
{
"tag": "v0.2.1",
"kind": "patch",
"published_at": "2026-05-05T19:39:34Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-05-05T17:41:05Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-05-05T15:05:34Z"
}
],
"recent_commits": [
{
"oid": "c54c67cac4ae8e34fedb6b2a5305b116a8628e30",
"body": "bench_scale_test.go: scale benchmarks (BenchmarkScale_BulkLoad1M_*,\nBenchmarkScale_FindBySubject_After1M_*, BenchmarkScale_FindByPredicate_After1M_*)\nfor SQLite + Pebble at 1M-quad workloads. Exercises LSM / B-tree shape\nat sizes where small-N benches may not extrapolate. Predicate\ncardinality 100 d\n[…]\nle_' -benchtime=1x -run=^$ ./...\n\n.gitignore: *.test added to exclude `go test -c` compiled-test binaries\n(matches Go convention).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test+chore: 1M-quad scale benchmarks + gitignore *.test",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-15T15:11:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "77385a776164642a01342142765944c20f5dd340",
"body": "After a per-project audit (SecDek + lawdek-v2 + yeti-portrait + IGdek +\nmega-index + decklib), the consumer story in quadstore's docs was wrong\nin several load-bearing ways. This commit corrects them. CHANGELOG\n(append-only release record) untouched.\n\nREADME.md headline \"Pebble-backed by default\" pa\n[…]\nge-corpus consumers\n(~10M-100M+ quads)\" + accurate context that SecDek's 19M-quad snapshot\nremains the largest validated workload.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: reconcile to verified cross-project reality (2026-05-15)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-15T15:07:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "5d416288b0f6c89c060d93dda20dad69a436108d",
"body": "Within a single Commit the SQLite path runs INSERT OR IGNORE then\nDELETE. Pebble mirrors this. Net effect when the same (S,P,O,L)\nappears in BOTH lists: REMOVE — the Add is dedup'd as a duplicate\nand the Remove deletes the existing row.\n\nSurfaced 2026-05-10 in secdek's force-reemit backfill. Caller \n[…]\nfor an\nostensibly-additive change.\n\nAdding writer_remove_add_order_test.go to lock the behavior so it\ncan't silently change later.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(writer): document Adds-then-Removes ordering + lock-in test",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-10T09:55:27Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "aeb01012419355c13c2ad36c7b1ade41b3ef9963",
"body": "A practical guide for application authors who are choosing between\nquadstore's SQLite and Pebble backends, with specific guidance on\nthe multi-writer architecture decisions Pebble forces but SQLite\nhides.\n\nDistilled from production experience operating SecDek through a\nSQLite→Pebble cutover, 2026-05\n[…]\ny SecDek experience:\n 1. Expose IngestSortedExternalOptions.ScratchDir\n 2. Hoist a generic decklib/scheduler when 2nd consumer arrives\n 3. Strip a reference application showing Pattern 1 end-to-end",
"is_bot": false,
"headline": "docs: stacking writers on quadstore's Pebble backend",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-08T03:14:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "60a2c881e2c7db401d6e64c2ebc6c42311042da4",
"body": "…ollow-up\n\nSurfaced 2026-05-07 during the SecDek Phase 2 commit. Both date to\n2026-05-05 and pre-date current work. Decide whether to finish + land\nthe bench file or delete it; .test binary should be gitignored\nregardless.",
"is_bot": false,
"headline": "docs(todo): flag untracked bench_scale_test.go + quadstore.test for f…",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-07T15:23:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7982ccdd82fe5c012a984faf53658b0fb2d1bbc0",
"body": "Pebble's hardlink-based checkpoint primitive exposed as\n(*PebbleStore).Checkpoint(destDir) — atomic, sub-second on stores up\nto tens of GB, the right shape for a backup snapshot a sibling tool\ncan tar/upload while the live store keeps writing.\n\nOpenPebbleReadOnly registers the same label-count merger as OpenPebble,\nso verify-side tooling that opens a checkpoint produced by the live\nstore doesn't trip Pebble's \"merger name mismatch\" SST guard. SecDek's\ncmd/pebble-verify is the first consumer.",
"is_bot": false,
"headline": "feat(pebble): Checkpoint + OpenReadOnly on PebbleStore",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-07T15:21:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7bf63569528f970f5266bf794f4ef53312ca2606",
"body": "The third level of the ladder isn't a new API — it's a documented\nusage pattern. Closes the migration-guide ladder section.\n\nReal-world bulk ingest workloads almost never look like \"one giant\nslice of every quad in the universe\"; they look like many corpora\ningested sequentially (one Turtle file per\n[…]\neds RAM\n- per-corpus driver: when corpus has natural boundaries that\n fit in RAM individually\n\nAll three measured and documented.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: per-corpus driver pattern (third level of the IngestSorted ladder)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T16:22:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8a7a9055c049d6fa48300d54081b22dfdad2c0bc",
"body": "…roof\n\nTwo real-data validation runs of the IngestSortedExternal variant\nagainst the same 16,155,295-quad SecDek production snapshot:\n\nRun 1 — r6g.2xlarge (62 GB RAM, plenty of headroom):\n 3m 4.9s, 87,373 quads/sec sustained, ~1 GB peak memory\n vs in-memory IngestSorted on same hardware: 22% slowe\n[…]\n.log\n\n(Earlier runs already archived: -in-memory-r6g, plus the two\ncorrectness logs from the per-label-counter merger validation.)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: IngestSortedExternal validated end-to-end with bounded-memory p…",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T15:16:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d8e3e1e38d286f0e44eef0c062c75f4b87f6d3dc",
"body": "Adds the external-merge-sort variant on the IngestSorted ladder.\nReads quads from a channel, sorts in chunks, flushes sorted runs\nto disk, then k-way merges the runs into per-keyspace sstables and\nhands them to db.Ingest. Working set: ~400 bytes/quad × ChunkSize\n(default 500_000) regardless of total\n[…]\nk-class\ningest through this path) is the next bench step — pending bench\nhost availability after the in-memory variant validation.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(pebble): IngestSortedExternal — bounded-memory bulk ingest",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T14:30:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bc06a2692c79f9eff1c7ecfa05d277c084570206",
"body": "Real-data validation of the IngestSorted in-memory variant against the\n16,155,295-quad / 30 GB SecDek production snapshot. Documents the\nladder's first measured ceiling and the speedup vs the standard\nBulkLoader path.\n\nRun sequence:\n\n1. First attempt on t4g.xlarge (16 GB RAM): OOM-killed cleanly dur\n[…]\nntil it lands, the in-memory variant is the right\n choice for any consumer whose corpus fits the per-bench-host\n memory ceiling.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: IngestSorted in-memory benched 6.7× faster on SecDek snapshot",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T14:15:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d19d20992eb6ce590684f71d3a9c37eecb9a196e",
"body": "In-memory variant (option 1 of the three-level ladder in TODO.md).\nBuilds per-keyspace sorted sstables externally and hands them to\ndb.Ingest, bypassing the memtable + WAL + compaction work the\nstandard Writer / BulkLoader paths trigger per write.\n\nAPI:\n- *PebbleStore.IngestSorted(ctx, []Quad, Inges\n[…]\nhe SecDek-snapshot bench against the standard\nBulkLoader path. Numbers will land in MIGRATING_TO_PEBBLE.md as the\nbench completes.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(pebble): IngestSorted — bulk-ingest fast path via Pebble.Ingest",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T13:36:24Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3696cb810d1488a10b4b4f2bc01a61c351aa66d7",
"body": "…unt(Label)\n\nLive experiment outcome: Pebble's Reader.Count(Pattern{Label: X}) was\n4-5× SLOWER than SQLite's covering-index idx_lsp path because it was\niter-and-counting the LSP keyspace. Adding a maintained counter\nkeyspace + the Merge operator turns it into a single 8-byte Get,\nmaking Pebble win e\n[…]\nrn).\n- docs/bench-output/: archived raw bench output for both runs\n (with and without the merger) plus the correctness sweep log.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(pebble): per-label counter via Merge operator — 5,418× faster Co…",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T13:25:25Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a4627e803f826f8f22739cee26b48100ef311b74",
"body": "Honoring the constraint that public quadstore docs stay generic\nabout consumers' graph schemas — numbers (sizes, latencies,\nspeedups) are publishable; subject prefix names, partition\nrouting label-prefix lists, and internal aggregation names are\nnot. The risk: someone reading these docs could infer \n[…]\nioning\nrationale, cold-start measurement context) — they just don't\nhand a reader the exact graph schema of a production consumer.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: scrub project schema details from public docs",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T09:12:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c611febdd0e50988d349b66deac28fd8512e8d73",
"body": "A practical guide for moving an existing SQLite-backed quadstore\ndeployment to Pebble. Written so anyone hitting this fork in the\nfuture has the framework — not just SecDek and not just us.\n\nStructure:\n\n- \"Decide whether to migrate at all\" — a 30-second self-check\n table (hosting shape, disk profil\n[…]\ner\n saying its plan-as-shipped is now a stepping stone toward the\n Pebble cutover (the SQLite-era fix for a SQLite-era problem).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add MIGRATING_TO_PEBBLE.md + flag SecDek as live experiment",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T08:56:56Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ddf1ba0f754f3a29af50a7e7521f3ed7a1dd1875",
"body": "The previous commit (81daf74) overstated which dek products run\nquadstore in production. Verified against actual go.mod / call\nsites across all dukkandcards repos:\n\n - ~/secdek → DOES import quadstore (Open + OpenPartitioned), running SQLite in production at sfy.io\n - ~/yeti-portrait \n[…]\nshot (real production data) round-tripped to Pebble\" so\n the reader doesn't infer Pebble is deployed in production.\n\nBuild clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: correct false production-user claims; honest origin story",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T08:45:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "81daf74e23052a927564b1aea3a53d1918bf8d76",
"body": "The v0.2 Pebble work was driven by SlideDek's 133M-quad / 60 GB\nSQLite workload, not SecDek's. SecDek (19M / 28 GB) was the\nbyte-perfect validation case after the Pebble backend shipped.\nEarlier docs misattributed the 133M / 60 GB / 140-distinct-predicate\nnumbers to a \"SecDek-class corpus\" — those n\n[…]\nek\n corpus)\" → \"133 M rows (SlideDek corpus, the workload that drove\n the Pebble investigation)\".\n\nNo code changes. Build clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: SlideDek is the largest production user (corrects misattribution)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T08:39:14Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "3448057879e9f0dc6b7068b824796b624d413264",
"body": "Pass 2 of the post-Pebble docs cleanup, focused on what a stranger\narriving from Google sees first (pkg.go.dev godoc, examples/) plus\nthe supporting docs that pass 1 missed.\n\nPublic-surface alignment:\n- quadstore.go package godoc (what shows on pkg.go.dev): replaces\n \"SQLite default, Pebble opt-in\"\n[…]\ne\".\n\nBuild + vet clean. examples/minimal runs end-to-end on Pebble (3 quads\nwritten + read back, label-namespace check exercised).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: simplify on-ramps; credit Robert Melton; consistency pass 2",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T08:32:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d070e2386417b50d7581d85eee46cd40de800987",
"body": "Reframes the v0.2 docs around the decision: Pebble is the path\ngoing forward, SQLite stays supported indefinitely for callers\nwho prefer ~20 fewer transitive deps, smaller binaries, or\nsqlite3-CLI access on the data file. No code/API changes —\nOpen(path) still returns SQLite, OpenPebble(path) still \n[…]\nmit b4cf0c9 message and\nPEBBLE_VS_SQLITE.md §\"Real-data validation\"; archived bench file\ncaptured timing/correctness only, not du.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: Pebble is the recommended backend; SQLite stays supported",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T08:18:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "86e928a9824beeba797ce8ab5d59fefafefb6fb5",
"body": "The Pebble store has lived alongside SQLite as a parallel prototype\nfor weeks; SQLite remains the production backend (Open and\nOpenPartitioned both call the SQLite implementation). Top-of-file\nTODO so the decision doesn't keep drifting.\n\nForcing function: secdek-sqlite-busy is a live production alar\n[…]\ne_test.go on current corpus shape. Rough criteria\nspelled out so the decision is data-driven, not reactive to a single\nalarm fire.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(todo): track SQLite vs Pebble backend decision",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-06T06:36:03Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6356e07944a8768925c3cf1f07bd713d44874f6b",
"body": "go mod tidy during today's fork-on-trigger drill noticed that\ngithub.com/cockroachdb/pebble/v2 is a direct require (imported by\ninternal/pebbleq) but was marked // indirect in go.mod. Likely a\nstale annotation from when pebbleq was first added. Promoting to\ndirect + sweeping go.sum tidies.\n\nNo version change. v2.1.5 stays pinned.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(deps): pebble = direct require (post-tidy correction)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T21:20:17Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "85a8c32ec60fdea6034cb1bf365dd99c9e56d809",
"body": "Replaces the descriptive five-step plan in CONTINGENCY.md with an\nactual script — scripts/fork-pebble-on-trigger.sh — that executes\nthe full mitigation locally:\n\n1. Clones cockroachdb/pebble at the pinned SHA\n (36a5551312e40777b3afff9846796aaadca5f877 = v2.1.5).\n2. Refuses to proceed if upstream's\n[…]\ns. The fork\nwould be source-only; no operational tweaks needed.\n\nLICENSE_AUDIT.md now records the pinned SHA and the drill result.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(contingency): make Pebble fork-on-trigger automated and verified",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T21:19:53Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1f840a90368409c93b6dbd5a7c3eb15cd61484f8",
"body": "The optional Pebble backend pulls in 7 libraries maintained by\nCockroach Labs (pebble, errors, redact, swiss, crlib, logtags,\ntokenbucket). All currently Apache 2.0 / BSD-3, but Cockroach Labs\nrelicensed CockroachDB itself (Apache → BSL 2019, hybrid 2024) — the\ntrust profile warrants explicit invent\n[…]\n(\"don't auto-upgrade\nPebble without re-checking license\") is documented in CONTINGENCY.md\nrather than as a fragile go.mod comment.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: license audit + Cockroach Labs contingency plan",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T20:58:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "bf3d1f168c1fc2de2483682616b69e8b064fcb5d",
"body": "5 s wasn't enough to wait out a SecDek server warmup. The\ngridCorpusIndex build issues bursts of multi-second writes that\nhold the WAL writer slot; concurrent writers (edgar-load,\ncorrespondence-load) hit SQLITE_BUSY after 5 s and either log-\nand-skip or fail outright.\n\nObserved 2026-05-05 post-resi\n[…]\nemedy for transient writer\ncontention; it was already partially in place at 5 s, just\nunder-sized for our workload. No API change.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(open): bump busy_timeout 5 s → 60 s",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T19:39:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b4cf0c9215f428a9440b5d063e2572908725f43c",
"body": "Took the live SecDek nightly backup (production quadstore at\nsfy.io), copied it to a fresh EC2 t4g.xlarge / gp3, ran\ncmd/pebble-correctness: MigrateToPebble + byte-identical comparison.\n\nSource corpus:\n 19,176,859 quads\n 2,688,183 distinct subjects\n 337 distinct predicates\n 28 GB on disk (SQLite\n[…]\nion at scale,\nread-side scan performance.\n\nWhat's still ahead (RETHINK_TEST_PLAN.md item D): a real consumer\nin shadow mode for ~30 days. The byte-identical correctness here is\nthe gate to start that.",
"is_bot": false,
"headline": "docs: real-data validation — 19M-quad SecDek migration → Pebble",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T18:32:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "60acb0204fd6cb6c8d8567bf175602dd630146c0",
"body": "Driver for validation step C in RETHINK_TEST_PLAN.md: take a real\nSQLite-backed quadstore (e.g. SecDek's nightly backup), migrate to\nPebble via MigrateToPebble, then assert byte-identical results\nacross both backends on:\n\n- Total quad count\n- Distinct-subject hash (sha256 of sorted distinct subject \n[…]\ngo build -o pebble-correctness ./cmd/pebble-correctness\n pebble-correctness -src /path/sqlite.db -dst /path/pebble-dir [-sample N]\n\nOutput is a sequential log of each phase + per-check OK/FAIL lines.",
"is_bot": false,
"headline": "cmd/pebble-correctness: real-data SQLite-vs-Pebble correctness check",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T17:56:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8505dfeb927af7838a3f1559ae7c6c429c3b1ee9",
"body": "Validates Pebble integration on real-shaped workloads beyond the\nhand-picked fixtures in pebble_store_test.go.\n\nA. Property-based round-trip (TestPebbleTorture_RoundTrip):\n\n Generates 5000 random quads with content drawn from ASCII +\n Latin-1 + Cyrillic + CJK runes (NUL stripped — known key-\n \n[…]\n470 lines of\ntest code, no production code changes.\n\nOutstanding: C (real SecDek-snapshot migration test) and D (real\nconsumer in shadow mode) are bigger commits, planned but not blocked\non this work.",
"is_bot": false,
"headline": "test: A + B — property-based torture + crash recovery for Pebble backend",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T17:46:53Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c5b067b4c73988aabc3cc8dc89d105ccf9067818",
"body": "Date-stamps the v0.2.0 entry. Full release notes in CHANGELOG;\nheadline: quadstore.OpenPebble(path) ships behind the same\nWriter/Reader/BulkLoader surface as the SQLite-backed Open(path),\nwith measured 18-40x single-commit advantage and 5.5x bulk-load-\nat-100k advantage on cloud Linux. SQLite stays the default;\nPebble is opt-in.",
"is_bot": false,
"headline": "release: v0.2.0 — Pebble backend (opt-in) shipped",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T17:41:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b6b805992135dfff8e485cc26ee2e022000f7b5a",
"body": "Audit pass — the public quadstore docs were pointing readers at\ninternal paths in a closed-source consumer (SecDek). Those readers\ncan't access those files; the references either looked broken or\nsuggested the source was browsable. Both bad. Fixed:\n\n- examples/README.md: removed the \"look at how Sec\n[…]\ngeneric note that the consumer-specific migration plan is\n out-of-tree.\n\nPublic product references via https://sfy.io stay (CHANGELOG and\nREADME) — they cite a known production user, not source code.",
"is_bot": false,
"headline": "docs: remove pointers into closed-source SecDek internals",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T17:37:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8298a8ec9498115ab2d0d739c1628847c140f338",
"body": "Two changes that should have landed alongside the public OpenPebble\ncommit but didn't.\n\nquadstore.go package godoc:\n Was: \"Package quadstore is a minimal quad store backed by SQLite.\"\n Now: explicitly documents both backends, points at OpenPebble,\n references docs/PEBBLE_VS_SQLITE.md, mentio\n[…]\n2 with full\n Writer/Reader/BulkLoader/LabelCounts/Stats/CommitStatsAt\n surface and cross-backend migration.\"\n\nBoth surfaces — pkg.go.dev godoc and README — now match the\nstate of the repo.",
"is_bot": false,
"headline": "docs: package godoc + README \"Where it stands\" reflect v0.2-track",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T17:25:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a01297969e6bbc1f9761c481781e63ac49042a82",
"body": "Added BenchmarkConcurrentWriters_{SQLite,Pebble}_8x and a BigBatch\nvariant. Hypothesis going in: Pebble's \"no single-writer ceiling\"\nshould give linear concurrent scaling. The numbers say otherwise.\n\nM1 Pro, 8 goroutines × 100 single-quad commits = 800 total:\n\n Serial: SQLite 79 ms, Pebble 15 \n[…]\ne here.\n\nAnti-marketing note: this is the kind of finding that wouldn't\nland in a Pebble pitch. Landing it because honesty about limits\nis the only thing that distinguishes the doc from a sales sheet.",
"is_bot": false,
"headline": "bench: concurrent-writers — honest finding, scaling didn't materialize",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T17:24:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "57ffca3e4f2a49506ad6974c1e7d84014a132254",
"body": "License audit on 2026-05-05 of every transitive dep Pebble adds:\n- github.com/cockroachdb/pebble/v2 — BSD-3 (LevelDB-Go Authors)\n- github.com/DataDog/zstd — BSD-2\n- github.com/getsentry/sentry-go — MIT\n- github.com/cockroachdb/* (errors, redact, swiss, tokenbucket,\n logtags, crlib) — Apache 2.0\n- g\n[…]\ncom/{kr,beorn7,cespare,dustin,RaduBerinde}/* — MIT\n- everything else — MIT or BSD\n\nNo AGPL, no BSL, no commercial-use restrictions. Adding this\naudit note to CHANGELOG so future evaluators can verify.",
"is_bot": false,
"headline": "docs: confirm Pebble-introduced deps are all permissive",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T17:17:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4d7760b50eb175c6659b8c4b913fa0fa4779f95a",
"body": "Closes the v0.2 parity gap so users on existing SQLite stores have a\nreal path forward to the Pebble backend.\n\nAdded:\n\n- (*PebbleStore).LabelCounts(ctx) — iterates the LSP keyspace with\n per-label SeekGE skip; O(distinct_labels × log N).\n- (*PebbleStore).Stats() — quad count from SPO scan; distinct\n[…]\nbleStore: Match (legacy *Iterator type;\nusers use Reader.Find with iter.Seq2), Path (graph traversal\nhelpers), and partitioning (single Pebble dir per Store). All\ndeferred until concrete user request.",
"is_bot": false,
"headline": "feat: Pebble parity — LabelCounts, Stats, CommitStats, MigrateToPebble",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T17:16:18Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "29cc854084ed82d0e3f0ddeb5171e13c80f966eb",
"body": "Ran the same bench suite on a fresh AWS t4g.large (2 vCPU /\n7.6 GB / 50 GB gp3 EBS / Ubuntu 24.04 ARM64) to confirm the M1 Pro\nresult wasn't a laptop-disk artifact.\n\nDisk probe (fio random 4K writes, iodepth=1, O_DIRECT+O_SYNC):\n gp3 EBS 345 IOPS, ~2.9 ms per fsync\n M1 NVMe ~30,000+ IOPS for\n[…]\ns opt-in via OpenPebble.\nv1.0 question of which becomes default still open — Pebble's\n~20 transitive deps and lack of sqlite3 CLI debuggability are\nreal costs the speed wins must continue to outweigh.",
"is_bot": false,
"headline": "docs: Linux EC2 t4g.large numbers — Pebble dominance widens",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T17:05:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9d6c44870e110ae5a844db93b02816ca1cc7e6eb",
"body": "Promotes internal/pebbleq behind a public quadstore.OpenPebble(path)\nAPI. SQLite-backed Open(path) stays the default; users opt in to\nPebble when the perf wins justify the transitive-dep cost.\n\nPublic API additions:\n- OpenPebble(path) (*PebbleStore, error)\n- (*PebbleStore).Close() / Writer / Reader \n[…]\nANGELOG updated with full breakdown of perf wins, dep cost, and\nremaining gaps. README adds a one-paragraph callout for the\nopt-in. Cloud Linux numbers still pending — see RETHINK_TEST_PLAN.md\nTest 2.",
"is_bot": false,
"headline": "feat: quadstore.OpenPebble — public opt-in Pebble backend",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T16:48:56Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "60c7c3f4912e9dfea59b07104fb64dfe0aa92bef",
"body": "Updates the head-to-head doc now that the Pebble prototype has\nfeature parity (audit, label validation, real Find). Adds the\naudited single-commit row, which is the comparison most production\nusers care about: 5.95 µs (Pebble) vs 107 µs (SQLite) — 18× faster.\n\nDecision-rule moves from \"4 of 5\" to \"5\n[…]\n the new audited\nbatch and find rows holding up. Updated \"What this benchmark does\nNOT prove\" to remove the prototype-omits-audit caveat (no longer\ntrue) and the no-validation caveat (no longer true).",
"is_bot": false,
"headline": "docs: refresh PEBBLE_VS_SQLITE with audited prototype numbers",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T16:43:50Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a6a20c099a00a151329def64814bc19e4933a289",
"body": "Promotes internal/pebbleq from \"minimum viable bench harness\" to\n\"production-shaped prototype.\" Still under internal/ until Linux\nnumbers confirm and we decide on the public OpenPebble entrypoint.\n\nAdded to match writer.go / reader.go / bulk.go semantics:\n\n- Label namespace validation. source: / der\n[…]\nh backend side-by-side.\n\nNext: same bench suite on cloud Linux to confirm the deltas survive\nreal-disk fsync. If they hold, promote pebbleq behind quadstore.\nOpenPebble(path) as a v0.2 opt-in backend.",
"is_bot": false,
"headline": "pebbleq: feature-complete prototype with audit, validation, real Find",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T16:42:58Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f6d460517819509036a0e00f9cc5f87bd1586204",
"body": "internal/pebbleq/ is a non-production prototype: same Open/Writer/\nReader/BulkLoader API shape as quadstore proper, four-keyspace\nencoding (SPO/POS/OSP/LSP with single-byte prefixes), default Pebble\noptions other than a quiet logger.\n\nComparison runs at lazy-fsync durability on both sides (SQLite\nsy\n[…]\nction commands\n\nNext: same suite on cloud Linux (t4g.large, gp3 EBS) to confirm the\ndeltas survive a real-disk fsync profile. If they do, begin\nproduction Pebble port behind quadstore.OpenPebble(...).",
"is_bot": false,
"headline": "bench: Pebble prototype + head-to-head numbers vs SQLite (M1 Pro)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T16:30:41Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c6865294b4a984512ba71e40d89d851dd1808228",
"body": "The rigorous analysis lives in RETHINK_2026.md; this doc is the\nshort-form decision artifact:\n\n- Recommendation (swap SQLite for Pebble), with order-of-magnitude\n expected deltas as a target, not a claim.\n- Three tests in priority order, with explicit pass/fail criteria:\n 1. Pebble head-to-head — \n[…]\nd order if we proceed (5 steps, internal/pebble/*).\n- Compatibility commitment: public API surface does not change\n during the prototype; existing deployments are not broken to\n land a backend swap.",
"is_bot": false,
"headline": "docs: RETHINK_TEST_PLAN — actionable companion to RETHINK_2026",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T16:09:24Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b14635a6b41aebf9fdcec75a26b7f8f461354554",
"body": "Rigorous self-audit. Separates what's aged well (label namespace,\nembedded library, pure Go, Reader/Writer/BulkLoader API, audit as\nwrite-time invariant) from what we'd change today.\n\nThe biggest lever: swap SQLite → Pebble. SQLite's structural costs\n(single-writer ceiling, B-tree index rebuild, INS\n[…]\nnside SQLite.\n\nLinked from README \"Start here\" so it's findable as a public\nposition, not internal note. Open invitation: run any of these\ntests on a server we don't have access to and PR the results.",
"is_bot": false,
"headline": "docs: RETHINK_2026.md — what we'd build differently today",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T16:07:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f2daa0ce9bb63ac698bdc541fe02d0a1f6c96be1",
"body": "Closes the largest open issue in LIMITATIONS.md. Single-quad Commit\ndrops from ~108 µs → ~60 µs (45% faster) on M1 Pro / darwin-arm64,\nbenchtime=3s, count=2 — putting Writer.Commit within ~2.4× of raw\nmodernc.org/sqlite single-INSERT (was ~4.3×).\n\nAPI: additive bool field on Batch (zero-value preser\n[…]\nwrites.\n\nTests: TestWriterCommit_NoAudit (audit rows are zero, mixing works)\nand TestWriterCommit_NoAudit_LabelStillValidated (label rules are\nnot bypassed). Bench: BenchmarkCommit_SingleQuad_NoAudit.",
"is_bot": false,
"headline": "feat: Batch.NoAudit — opt out of commits + commit_ops for hot paths",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T16:04:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "69eef82c028e46610e0f69934d729e0414ebfd98",
"body": "Single-page audit of every way quadstore is worse than what an\nevaluator might hope for. Organized so adoption decisions are made\non real evidence, not the marketing surface:\n\n- Hard constraints (architectural, will not change): single-writer\n per partition, no sharding, no query language, no graph\n[…]\nys honest.\n- Empty-promise check: invitation to PR-remove items that quietly\n got fixed; performance numbers should be reproducible.\n\nLinked from README \"Start here\" so it's findable before adoption.",
"is_bot": false,
"headline": "docs: add LIMITATIONS.md — expose every known problem honestly",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T16:00:21Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "13d136a1b4bdf2931dad45df8f545ea38ce107be",
"body": "Original code prepared addQuad, logOp, and removeQuad on every Commit\nregardless of what the batch contained. For the common shape\n(Adds-only, no Removes) the removeQuad prepare is pure waste.\n\nNow: only prepare statements we'll actually Exec against. Single-quad\nCommit drops from ~121 µs to ~112 µs\n[…]\nonConn, rebind\nvia tx.StmtContext) was tested and reverted: tx.StmtContext adds\noverhead that regresses Batch1k by ~14% under modernc/sqlite,\nwiping out the single-commit gain on workloads that batch.",
"is_bot": false,
"headline": "perf: skip Prepare in Writer.Commit for unused statement paths",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T15:55:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7666257512dae3fc2f6e7fc3cd87383ca15a1493",
"body": "Replaces the technical-overview README with the conversational\n'Graph with a purpose' framing — leads with the four real questions\n(provenance, multi-tenancy, derivation rebuild, audit) that pushed\nus from triple to quad, and lets the label namespace fall out as\nthe answer.\n\nKeeps the comparison tab\n[…]\ninding: BulkLoader is within ~2% of expert\nhand-rolled SQLite using the same schema.\n\nNet: 213 → 128 lines, opening section now tells the user what\nproblem this exists to solve before showing the API.",
"is_bot": false,
"headline": "docs: rewrite README with origin-story voice from writeup",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T15:55:25Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "47d0b679ff701b06d37e53ab40fc00a325d96167",
"body": "Adds BenchmarkCompare_RawSQLite_QuadstoreShape: raw modernc SQLite\nrunning quadstore's exact schema and exact pattern (four indexes,\ndrop three on load start, multi-row INSERT in 500-row batches,\nrebuild on close). Same pattern, no library.\n\nResult: BulkLoader is +6% at N=1k and +2% at N=10k/100k vs\n[…]\norkload\nonly reads by subject, you'd reproduce the simple-raw numbers in 200\nlines. If you read by predicate, object, or label too, you'd\nreproduce quadstore's schema and land at ~the same throughput.",
"is_bot": false,
"headline": "bench: prove BulkLoader is within 2% of hand-rolled raw SQLite",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T15:38:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6d788a2700b06993bd10695e4558899966c0e9cc",
"body": "Earlier 9× overhead claim was a benchmark methodology bug — the loop\nreused the same store across iterations, so later iterations inserted\ninto a 320k-row table while the timer kept running. Fresh DB per\niteration via b.StopTimer/StartTimer fixes it.\n\nHonest overhead at scale: ~2.2× across N=10k and\n[…]\n rows that's\nnet-negative, which is why Writer.Commit batches are the right tool\nfor small loads.\n\nUpdates docs/PERFORMANCE.md with the corrected numbers and the\nbreakdown of where the overhead lives.",
"is_bot": false,
"headline": "bench: parameterize bulk-load comparison across N=1k/10k/100k",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T15:33:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5b258716f5bf1729d69dee9f6947a952c5c6f16e",
"body": "Adds bench_compare_test.go: hand-rolled raw SQLite quad table on the\nsame modernc.org/sqlite driver, same WAL+NORMAL defaults quadstore\nuses, plus a BulkLoader-equivalent path with the bulk PRAGMAs the\nlibrary applies internally.\n\nCaptures the actual cost of using the library:\n- Single-quad commit: \n[…]\nead comes from. Also fixes a misleading\nline that claimed synchronous=FULL — quadstore opens WAL+NORMAL, so\nthe existing microbenchmark numbers were already taken with the\nrelaxed durability settings.",
"is_bot": false,
"headline": "bench: side-by-side vs raw SQLite (same modernc driver, same PRAGMAs)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T15:25:52Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b274b7ad6cc88022ab10b6220bc61c442f43a021",
"body": "Make the project feel like one a serious developer would invest time\ninto:\n\n- .github/ISSUE_TEMPLATE/bug_report.md — guides reporters toward the\n reproducer + environment info we need.\n- .github/ISSUE_TEMPLATE/feature_request.md — explicitly states the\n project's scope (\"no sharding, no query lang\n[…]\nitly NOT\n claiming as our own.\n\nThese don't change any code. They change first-impression signals\nwhen someone lands on the repo.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: GitHub repo polish — issue/PR templates, security policy, CoC",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T15:17:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "2f5ecb26045231a9f45539dad0384b313ace034b",
"body": "The README's Inspiration section becomes Acknowledgements — explicit\nthanks by name, framed as the door being open if Barak or Robert ever\nwant to engage. Goal: if either of them ever lands on this repo, they\nshould feel respected, not \"credited as required.\"\n\nNew ACKNOWLEDGEMENTS.md gives a longer-\n[…]\ny + modernc.org/sqlite (Jan Mercl) + SQLite (D. Richard Hipp) +\nthe Go team for iter.Seq2. Linked from README documentation index.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: warmer credit to Barak Michener + Robert Hessmann + Cayley lineage",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T15:14:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "15e41886c0af286770b6ad3b80d3c49e59538971",
"body": "Real benchmark numbers on M1 Pro:\n Commit_SingleQuad: 116 µs/op (~8,600/sec) — synchronous=FULL fsync each\n Commit_Batch1k: 12 µs/quad (~80,000/sec) — amortized batch\n Find_BySubject: 69 µs/op (~14,400/sec) — indexed lookup\n\nProduction observations from SecDek (28 GB graph, t4g.large\n[…]\nn work (PRs welcome): BulkLoader 1M-quad bench, concurrent-reader\ncontention bench, side-by-side vs raw SQLite + vs Cayley/BoltDB.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: PERFORMANCE.md — measured numbers + practical guidance",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T15:12:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e6ef910275a282f01c5b0661296511be59eccd46",
"body": "Three self-contained main.go programs that demonstrate the library's\nmain shapes. Each is short enough to read in one screen, builds clean\n(CI verifies it), and writes to a MkdirTemp directory that's cleaned\nup on exit.\n\n- minimal — Open + Writer.Commit + Reader.Find. The 30-second\n walkthrough. Sh\n[…]\nalidation error (\"label X must start with one of: source:,\nderived:, human:, meta:\").\n\nREADME updated with explicit example links.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "examples: 3 runnable programs (minimal / audit-log / multi-tenant)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T15:11:20Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d226b76ea9cdf9ca83c9ef4d749b6720dbc1d467",
"body": "- README: sharpened positioning (\"graph database for Go applications,\n pure Go, no CGo\"), comparison table vs Cayley/Dgraph/SQLite, status\n callout, expanded Cayley credit (Barak Michener, Robert Hessmann),\n badges, honest \"used in production\" (just SecDek for now).\n- CHANGELOG: v0.1.0 entry — wh\n[…]\nssed all targets.\n- Removed docs/QUADSTORE.md (older overlapping positioning doc; README\n covers the same material more crisply).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "v0.1.0: first public release",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T15:05:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "00cad44c4af4d51700c6b6324ed1a10cd4f06da4",
"body": "…tion\n\nThe original framing reached for watermarks as the default answer.\nFor most ingest pipelines the simpler answer — a per-subject\nsentinel check that gates the expensive work — is sufficient and\nproven in production. Reach for watermarks only when many phases\nshare a change-set stream and empty\n[…]\nr to retired SecDek redesign plan with\n pointers to INGEST_CONVENTION.md and INGEST_AUDIT.md as worked\n in-repo specializations.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(incremental): lead with per-subject sentinel; cite SecDek conven…",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T07:41:52Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "298b7fb1565cb5fb7c8473fabdb6a501b3e8367e",
"body": "Library consumers keep falling into the \"rebuild from scratch every\ntick\" anti-pattern: every recurring derivation reads the entire\ncorpus, recomputes everything, and writes the result. Cheap on day\none, breaks at scale.\n\nThis doc captures the three patterns that fix it (Watermark for\nderivation, Co\n[…]\nces PARTITIONING_DESIGN.md (orthogonal but\ncomplementary) and SecDek's INGEST_REDESIGN_PLAN.md (the SecDek-\nspecific application).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add INCREMENTAL_PROCESSING.md — patterns + anti-patterns",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T07:20:42Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "67edbfd1443092dffb6b335fa3cbe7b1c0e97b5e",
"body": "Adds quadstore.MigrateFromSnapshot(ctx, srcPath, dst, opts) which takes\na consistent point-in-time copy of the source via SQLite's\n`VACUUM INTO`, then runs Migrate against the frozen snapshot.\nConcurrent writers on srcPath remain unblocked throughout (per SQLite\ndocs); the migration sees a single co\n[…]\nnt. The library trusts the caller.\n\nDoc: ~/quadstore/docs/PARTITIONING_DESIGN.md §Migration tooling.\nTests: 3 new (46 total pass).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(migrate): MigrateFromSnapshot for race-free upgrades",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T06:37:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8289ed61ee97b71aab6cd0b6cfd2ddaed0ee218e",
"body": "Migrate was setting bl.batchSize = opts.ChunkSize (default 10000),\nproducing 40000 SQL variables per multi-row INSERT and tripping\nmodernc.org/sqlite's SQLITE_MAX_VARIABLE_NUMBER ceiling with\n\"SQL logic error: too many SQL variables (1)\".\n\nBulkLoader's default of bulkBatchRows = 500 (= 2000 vars per\n[…]\necoupled from the\nper-INSERT row count.\n\nCaught while applying SecDek's first real migration on a 19 M-row\nsource DB (2026-05-05).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(migrate): don't override BulkLoader.batchSize",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T06:28:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6fd33c3a501b0b1cbc6e642616c158af3ea282a1",
"body": "A single quads table hits a B-tree dilution wall when a Store\naccumulates fact families that don't share queries. Concrete trigger:\nSecDek's live DB grew 1.3 GB → 28 GB in two weeks after a comment-\nletter corpus load, and product queries on the (still-256K-row)\nno-action letter family now scan a B-\n[…]\n\nAlso brings previously-untracked baseline files into version control:\nREADME.md, LICENSE, CONTRIBUTING.md, bulk.go, bulk_test.go.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: partitioning support (OpenPartitioned, Migrate, fan-out reader)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-05T06:06:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "188db91d6ffa04888a3efa4f2ab0d5b0f20d263c",
"body": "SQLite's wal_autocheckpoint moves data into the main DB on schedule\nbut with journal_size_limit=-1 (the default) the WAL high-water mark\nis never truncated — bytes are reused for the next round of writes,\nso on long-lived writers (server processes, daily-running ingests)\nthe WAL file grows unbounded\n[…]\n small enough to bound disk consumption\nacross long uptime windows.\n\nAffects every quadstore consumer (SecDek, LawDek-v2, future).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(open): add journal_size_limit=500MB to default DSN PRAGMAs",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-05-01T08:03:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "139799f9a972221fcd24ada6bfc0822496eaeadf",
"body": "commit_ops grows unbounded (1 row per add/remove per commit); in SecDek\nit was 1.87M rows / ~42% of the 1.7 GB DB file. Its parent table\n(commits) holds lightweight provenance metadata and stays.\n\nAdditive API (no break):\n- Writer.PruneOps(ctx, olderThan) deletes commit_ops rows for commits\n whose \n[…]\nd.\n\nTestWriterPruneOps covers: delete eligible, preserve commits, preserve\nquads, idempotent, error-after-close. 26 tests passing.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: commit-journal retention — Writer.PruneOps + cmd/prune",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-20T16:54:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d9f37f5d7860243899b74d44dd05c4a4c5c48bd6",
"body": "…y ignored)\n\nThe prior DSN (?_journal_mode=WAL&_busy_timeout=5000) is not honored by\nmodernc.org/sqlite on file-backed DBs. Verified 2026-04-20 on the live\n1.7 GB SecDek DB: journal=delete, synchronous=FULL, cache=2MB default,\nbusy_timeout=0 — every dek product has been running in default\nrollback-j\n[…]\n6 MiB).\n\nPost-fix verification on fresh DB: journal=wal, sync=1, cache=-262144,\nbusy=5000, WAL sidecar created. All 25 tests pass.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: apply journal_mode/busy_timeout via _pragma= (legacy DSN silentl…",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-20T16:42:12Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "f32eaaff631b9984d69c9c9249e537f57b2893ba",
"body": "Three benchmarks to catch regressions when LawDek/PubDek workloads\nstart exercising the DB:\n- BenchmarkCommit_SingleQuad: per-commit overhead (WAL fsync dominates)\n- BenchmarkCommit_Batch1k: ingest-pipeline throughput\n- BenchmarkFind_BySubject: indexed-read latency\n\nFirst run on M1 Pro: 1.6k/sec sin\n[…]\ns, 75.8k/sec batched,\n73µs Find — see project_dek_graph_db_api.md pre-pass decisions for\ninterpretation and numbers-drift caveats.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: baseline benchmarks for commit and Find paths",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-14T02:33:05Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "37afc514f492dd904846c07cdaa16119e8e3cd80",
"body": "…ation\n\n5 instances of fmt.Println(\"text\\n\") changed to fmt.Print(\"text\\n\\n\").\nSame bytes on stdout, vet-clean. Unblocks `go test ./...`.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(observe): satisfy go vet while preserving visual blank-line separ…",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-14T02:25:04Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d24279ac2449707bc5357ce1caee670f7dead530",
"body": "…ption\n\nAdds rigorous API for dek-family graph DB consumers (LawDek, PubDek):\n- Writer/Reader separation, ctx throughout, iter.Seq2 streaming\n- Batch type: Adds, Removes, default Label, Metadata\n- commits + commit_ops journal (schema v2, UUIDv7 time-sortable ids)\n- Enforced label namespace on Writer\n[…]\ne) built-in\n- Partition opaque key reserved for future per-partition routing\n- 11 new tests covering new surface; 25 total passing\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: Writer/Reader API with commits journal for multi-product consum…",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-14T02:24:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0e7293e5518e47199834c23452161b461136f079",
"body": "RESEARCH.md: added page clustering section with cluster-to-index\nmapping table, interactive HTML tool description, and the key insight\n(find clusters, don't name them).\n\nCHANGELOG.md: added second session with observe tool, HTML review\npage, key findings, and research correction.\n\nTODO.md: updated to current state — clustering works, next steps\nare Michelle feedback and mega-index integration.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: update RESEARCH, CHANGELOG, TODO for clustering session",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T22:32:59Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8d3a63cf66535f6ef724323a39681b4b0cf57aa9",
"body": "fmt.Sprintf had 4 substitutions but only 3 args. Added simJSON\nas the 4th arg. Clusters now render and splits use real cosine\nsimilarity from the precomputed matrix.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: pass simMatrix to HTML format string (was MISSING)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T22:19:45Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "cc050e2fe2d0633ceec0c001995a3ae71693838f",
"body": "- Precompute full pairwise similarity matrix server-side, embed in HTML\n- Client-side split uses real cosine scores instead of 6-word Jaccard\n- Minimum 4 pages required to split (guarantees 2+ per side)\n- Refuses to split if pages can't be meaningfully separated\n- Results sorted by page number\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: split uses real cosine similarity, enforces min 2 pages per group",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T20:47:44Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "79eb9c8e74f25173c2c0de902696fb3954b14b51",
"body": "- Each cluster has a \"Split this group\" button that divides it into\n 2 sub-clusters based on vocabulary similarity (k-means k=2 Jaccard)\n- Sub-clusters indented with left border, labeled with parent\n- Splits can be repeated: 10 → 15 → 22 → name them → export\n- Page text now flows as prose (PDF line\n[…]\nanularity is right, then name each group. The depth at which\nthey stop splitting reveals the natural granularity of index entries.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: split clusters + clean text formatting",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T19:53:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "de16bfaff398ce33be2ed9a71a855583587d655f",
"body": "Self-contained HTML page (no deps, 35KB) showing page clusters.\nThe indexer opens in a browser, names each cluster, expands pages\nto read text, and exports named clusters as JSON.\n\nUX flow: see clusters → name them → verify by reading → export.\n\nIteration 1 of 3: static presentation + naming + export.\nNext: split/merge clusters, drag pages between groups.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: HTML cluster review page for indexer",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T19:17:55Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e6c66ddd2416134301cffc6e20d601a198427ea5",
"body": "Page clustering via TF-IDF cosine similarity finds 10 clusters that\nmap directly to Michelle's major index groupings:\n- Cluster 1 (23-33): food/acorns/hoarding\n- Cluster 2 (4-6,36,50-55): tools/bill/tongue\n- Cluster 3 (1,60-68): species identification/key\n- Cluster 4 (17-22): sapsuckers/sap\n- Cluste\n[…]\ng\n\nThe tool finds the group boundaries. The indexer names them.\nThis is the expose-don't-solve pattern: unnamed groups for review.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: page clustering + page range fix",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T19:08:38Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a77572adf4ee35642cc3b1c9f13cdbb1fa9fd022",
"body": "Parser was only extracting range endpoints, not filling in between.\nen-dash and hyphen ranges now properly expand. Adds 83 page references\nthat were being silently dropped.\n\nGenuine absence rate stable at 22.7% (was 22.9% before fix).\nThe finding holds — not a page mapping error.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: expand page ranges (23–27 → 23,24,25,26,27)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T18:57:41Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "c51e1783afdceab7c1126995c6dbdd7c0cb2cd14",
"body": "Original claim of 46.6% no-match was too strict. After accounting for\nmorphological variants: 22.9% genuine absence (down from 46.6%).\n\nDocuments the three operations of indexing:\n1. Direct extraction (25.8%)\n2. Normalization (30.7%)\n3. Extension + abstraction (43.5% — the human judgment layer)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: update RESEARCH.md with corrected input-output findings",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T18:55:13Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "3931545000d93818200dc4362623ce4fbb997345",
"body": "New cmd/observe with three modes:\n- Default: shows entry terms alongside their page text, side by side\n- -stats: counts how often entry terms appear on their pages\n- verify: digs into every \"no match\" pair to classify WHY\n\nKey finding (corrected from initial 46.6% claim):\n- 25.8% exact match (term i\n[…]\nxt match)\n2. Normalize (variant forms → canonical term)\n3. Abstract (name what the page discusses, even when the word isn't there)\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: observe tool — raw input-output analysis of index entries",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T18:54:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "78d50c8acd621958f366d81f10b2af84d9a53540",
"body": "TODO captures the research pause point and recovery steps.\nCHANGELOG documents everything built and found in this session.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add TODO (where to start next) and CHANGELOG",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T14:48:37Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0fc76f27f40c6d69671a7af480f9531ade280b16",
"body": "Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: remove redundant newlines in Println calls (vet clean)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T14:46:46Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9926152c51404a0e7e4c3d79e3ea385357f61456",
"body": "Cayley-inspired SQLite quad store (481 lines) with path traversal,\npattern matching, and tokenized shape export. Standalone Go module,\nzero deps beyond modernc.org/sqlite.\n\nIngest tool loads professional indexer's reference DOCX and NLP\npipeline output into same store with labels. Computes 9 signal \n[…]\nrch paused at: model the input-output transformation (pages →\nindex), not the indexer's intent. See RESEARCH.md for full analysis.\n\nCo-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat: quad store library + contention research (Woodpeckers)",
"author_name": "Jay Guiliano",
"author_login": null,
"committed_at": "2026-04-13T14:45:50Z",
"body_truncated": true,
"is_coding_agent": true
}
],
"releases_count": 6,
"commits_last_year": 74,
"latest_release_at": "2026-05-15T15:11:32Z",
"latest_release_tag": "v0.2.4",
"releases_from_tags": true,
"days_since_last_push": 50,
"active_weeks_last_year": 5,
"days_since_latest_release": 72,
"mean_days_between_releases": 2
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": true,
"health_percentage": 100,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"ecosystem": {
"packages": [
{
"name": "github.com/dukkandcards/quadstore",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/dukkandcards/quadstore",
"is_deprecated": false,
"latest_version": "v0.2.4",
"repository_url": "https://github.com/dukkandcards/quadstore",
"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-05-15T15:11:32Z",
"latest_version_yanked": null,
"days_since_latest_publish": 72
}
]
},
"popularity": {
"forks": 0,
"stars": 0,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": {
"days": [],
"complete": true,
"collected": 0,
"total_stars": 0,
"collected_at": null
},
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 26692,
"source_files_sampled": 52,
"oversized_source_files": 0,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "github.com/cockroachdb/pebble/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.1.5"
},
{
"name": "github.com/google/uuid",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
},
{
"name": "modernc.org/sqlite",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.48.2"
}
],
"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": null,
"bot_contributors": 0,
"top_contributors": [],
"contributors_sampled": null,
"top_contributor_share": null
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": 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": 0,
"reason": "project has 0 contributing companies or organizations -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 0,
"reason": "project is not fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 10,
"reason": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 10,
"reason": "security policy file 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": 10,
"reason": "GitHub workflow tokens follow principle of least privilege",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 8,
"reason": "2 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "c54c67cac4ae8e34fedb6b2a5305b116a8628e30",
"ran_at": "2026-07-26T15:55:30Z",
"aggregate_score": 5.1,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": true,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-05-15T15:14:49Z",
"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/dukkandcards/quadstore",
"host": "github.com",
"name": "quadstore",
"owner": "dukkandcards"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 52,
"inputs": {
"security": 51,
"vitality": 64,
"community": 43,
"governance": 35,
"engineering": 66
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "moderate",
"name": "Vitality",
"value": 64,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "at_risk",
"name": "Development activity",
"note": null,
"notes": [],
"value": 48,
"inputs": {
"commits_last_year": 74,
"human_commit_share": 1,
"days_since_last_push": 50,
"active_weeks_last_year": 5
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 50 days ago",
"points": 18,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 50
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "5/52 weeks with commits",
"points": 3.5,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 5
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "74 commits in the last year",
"points": 16.8,
"status": "partial",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 74
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 88,
"inputs": {
"releases_count": 6,
"latest_release_tag": "v0.2.4",
"releases_from_tags": true,
"days_since_latest_release": 72,
"mean_days_between_releases": 2
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "6 version tags (no GitHub releases)",
"points": 16.2,
"status": "partial",
"details": [
{
"code": "version_tags_no_releases",
"params": {
"count": 6
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 72 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 72
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~2 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 2
}
}
],
"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": "at_risk",
"name": "Community & Adoption",
"value": 43,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 0,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "0 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 0
}
}
],
"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": "excellent",
"name": "Community health",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": true,
"has_issue_template": false,
"has_code_of_conduct": true,
"has_pull_request_template": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (MIT)",
"points": 22.5,
"status": "met",
"details": [
{
"code": "license_standard",
"params": {}
},
{
"code": "license_spdx",
"params": {
"spdx": "MIT"
}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 18,
"status": "met",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 13.5,
"status": "met",
"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": 6.3,
"status": "met",
"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": 35,
"weight": 0.24,
"metrics": [
{
"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": "critical",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 16,
"inputs": {
"followers": 0,
"owner_type": "User",
"is_verified": null,
"owner_login": "dukkandcards",
"public_repos": 1,
"account_age_days": 192
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "0 followers of dukkandcards",
"points": 0,
"status": "missed",
"details": [
{
"code": "owner_followers",
"params": {
"count": 0,
"login": "dukkandcards"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "1 public repos, account ~0 yr old",
"points": 3.2,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 1
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/dukkandcards/quadstore"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 72
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 72 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 72
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "6 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 6
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "moderate",
"name": "Engineering Quality",
"value": 66,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"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": 60,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "1 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 1
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [
"embedded-database",
"golang",
"graph-database",
"graphdb",
"quadstore",
"sqlite"
],
"has_wiki": false,
"homepage": null,
"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": null,
"points": 0,
"status": "missed",
"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": "6 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 6
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "moderate",
"name": "Security",
"value": 51,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "moderate",
"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": 51,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 15,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 3,
"scorecard_aggregate": 5.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 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is not fuzzed",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file detected",
"points": 5,
"status": "met",
"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": "GitHub workflow tokens follow principle of least privilege",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "2 existing vulnerabilities detected",
"points": 6,
"status": "partial",
"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": "moderate",
"name": "AI Readiness",
"value": 59,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "at_risk",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "no CLAUDE.md / AGENTS.md / editor rules",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_instructions",
"params": {}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "74 of 74 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 74,
"sampled": 74
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 66,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.649,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "go.mod (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "go.mod"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "48 of the last 74 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 48,
"sampled": 74
}
}
],
"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": 26692,
"source_files_sampled": 52,
"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/52 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 52,
"oversized": 0
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "at_risk",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 40,
"inputs": {
"example_dirs": [
"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": "examples",
"points": 40,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "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": [
"Contributor list unavailable",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-26T15:55:32.965065Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/dukkandcards/quadstore.svg",
"full_name": "dukkandcards/quadstore",
"license_state": "standard",
"license_spdx": "MIT"
}