Informe JSON sin procesar legible por máquina
{
"data": {
"repo": {
"topics": [],
"is_fork": false,
"size_kb": 39598,
"has_wiki": false,
"homepage": null,
"languages": {
"C": 26684,
"Go": 43452,
"Rust": 1813869,
"Shell": 40557,
"Cypher": 1686,
"Python": 24229,
"Gherkin": 1471148,
"Makefile": 2170,
"Dockerfile": 5505,
"JavaScript": 24591
},
"pushed_at": "2026-07-12T13:41:28Z",
"created_at": "2026-04-12T20:28:41Z",
"owner_type": "User",
"updated_at": "2026-07-12T13:41:35Z",
"description": null,
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "Rust",
"significant_languages": [
"Rust",
"Gherkin"
]
},
"owner": {
"blog": null,
"name": "ds7n",
"type": "User",
"login": "ds7n",
"company": null,
"location": null,
"followers": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/270055197?v=4",
"created_at": "2026-03-22T04:01:13Z",
"is_verified": null,
"public_repos": 5,
"account_age_days": 127
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.1.2",
"kind": "patch",
"published_at": "2026-07-08T17:46:15Z"
},
{
"tag": "v0.1.1",
"kind": "patch",
"published_at": "2026-05-23T14:38:13Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-05-16T16:36:23Z"
},
{
"tag": "dev-latest",
"kind": "other",
"published_at": "2026-05-18T22:34:10Z"
}
],
"recent_commits": [
{
"oid": "124fc33af5c66abde15d3883489f85d788d47b00",
"body": "Bump workspace + node binding to 0.1.2. Move CHANGELOG [Unreleased] entries\nunder [0.1.2]. Re-baseline per-query alloc counts: delete_many/indexed_lookup/\nmerge_pattern rise slightly from the index-maintenance correctness fixes\n(full-label-set iteration, index label re-check, MERGE index maintenance).",
"is_bot": false,
"headline": "release: v0.1.2",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-07-08T08:15:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d87c3f0eaa96d8ff9ba2d8075071ef2189b8692",
"body": "…ion)\n\nFixes 8 correctness bugs found in the full-code-review: ORDER BY on\nnon-scalar types, MERGE/SET/label index maintenance (incl. multi-label\nper-label keying), OR-chain FTS dedup, index+FTS table-name collisions,\ncontradictory-equality predicate dropping, substring char-boundary panic +\nFFI panic safety, and edge-type counter drift. All with mutation-verified\nregression tests. 601 tests + TCK 3895/3895 green.",
"is_bot": false,
"headline": "Merge: index-maintenance + correctness fixes (7 findings + FTS collis…",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-07-08T08:03:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7c8f8d9b2d4b8798205cac089d73981b62836c8d",
"body": "Single-property FTS tables used node_fts_<label>_<property>, so (A_b, c) and\n(A, b_c) collided onto node_fts_A_b_c — a CONTAINS query on :A_b(c) could leak\nan :A node's b_c, and creating the second index spuriously reported\nIndexAlreadyExists. They now use the unambiguous node_fts$<label>$<prop>\nscheme (legacy _ tables still resolve for existing DBs via resolve_fts_table),\nmatching the btree fix. Discovery parses both schemes.",
"is_bot": false,
"headline": "fix(fts): collision-free single-prop fulltext table names",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-07-08T07:43:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7963312719e3f2b3e296de1b2ccac5eac418da01",
"body": "- e2e regressions: multibyte substring, OR-chain FTS dedup with divergent BM25\n scores, and duplicate-bound edge delete counter.\n- docs/cypher.md: document score(), fts.search, db.counts, composite CREATE\n INDEX; fix the stale 'no BM25/ranking' note and the db.indexes() kind list.\n- CHANGELOG: record all fixes under [Unreleased].",
"is_bot": false,
"headline": "test+docs: regression tests for the correctness fixes; refresh cypher.md",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-07-08T07:30:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd521246c55327165cfb766cb35aa316fda4715a",
"body": "substring() sliced by byte offset on a char index, panicking at a non-char\nboundary (e.g. substring('é', 1)); it is now character-indexed per the Cypher\nspec. That panic (and any other) crossing an extern \"C\" frame is UB / a\nprocess abort, so graphdb_query/graphdb_execute/tx paths now run under\ncatch_unwind and return -1 + graphdb_last_error instead of aborting the host.",
"is_bot": false,
"headline": "fix(ffi): catch panics at the C boundary; make substring char-indexed",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-07-08T07:30:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b52f3f3a22f7f9dc50bc8c0380caa92fc1a807ac",
"body": "delete_single_edge ignored kv::delete's bool result and always decremented,\nso deleting the same parallel edge twice (bound in multiple output rows) drove\ndb.counts()/planner cardinality below the true live count. Guard the decrement\non the delete result, matching delete_edge.",
"is_bot": false,
"headline": "fix(stats): only decrement edge-type counter when an edge was removed",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-07-08T07:30:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2d882c21c3c83ac31b6feb66ed46505382af727f",
"body": "WHERE n.x = 1 AND n.x = 2 on an indexed property folded only the last value\ninto the IndexLookup and dropped the other conjunct (shared (alias,prop) key),\nreturning wrong rows. Conflicting same-property equalities are now excluded\nfrom index candidacy and both conjuncts stay in the residual Filter, so the\nquery is correctly unsatisfiable regardless of conjunct order.",
"is_bot": false,
"headline": "fix(planner): keep contradictory equality conjuncts in residual filter",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-07-08T07:30:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e4d770d57a5d06f7df6353f0ab86b94d97e2a7da",
"body": "A node matching two disjuncts of an OR-chain rewritten to Union(FullTextLookup,\n..) gets a different BM25 __fts_score per branch, defeating the full-record\ndedup and returning the node once per matching branch. UNION dedup now compares\nrows ignoring the synthetic __fts_score key.",
"is_bot": false,
"headline": "fix(fts): OR-chain Union dedup ignores per-branch __fts_score",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-07-08T07:30:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d965542ee7a53564b60119d463c7d5f50cddc709",
"body": "…mutations\n\nIndex/FTS maintenance was keyed on labels.first() (the sorted-first primary\nlabel), silently corrupting indexes on multi-label nodes, and several write\npaths skipped maintenance entirely:\n\n- MERGE ON CREATE/ON MATCH SET n += {..} / = {..} / :Label now maintain indexes\n (the map/label ar\n[…]\nde onto one physical table.\n exec_index_lookup also re-verifies label membership defensively.\n\nAdds an index-consistency matrix test over every node-mutating op on both\nsingle- and multi-label nodes.",
"is_bot": false,
"headline": "fix(index): maintain secondary+FTS indexes across all label sets and …",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-07-08T07:30:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "49ef6c555b60bc5ad61494a77a7e73cbcb0bf976",
"body": "The named- and slot-iterator ORDER BY paths used a stripped comparator that\nreturned Equal for Bool, temporal, Duration, and List values, silently leaving\nthose columns in insertion order. Both paths now call the canonical\nexecutor::util::compare_values_for_sort (NaN last, lists element-wise).",
"is_bot": false,
"headline": "fix(sort): ORDER BY orders all value types on pull-based paths",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-07-08T07:29:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c041d11f13ef6746d7919beae5aae5172305b877",
"body": "Adds tuple-keyed btree indexes with leftmost prefix-match semantics\nacross storage, planner, executor, Cypher grammar, and all four\nbindings.\n\nAPI surface:\n- Database::create_composite_index(label, &[props]) /\n drop_composite_index, plus WriteTransaction parity\n- Cypher DDL: CREATE INDEX ON :L(a, b\n[…]\ner tests + TCK\n3895/3895; Python 3/3, Node 23/23, FFI 12/12, Go 31/31.\n\nSpec: docs/superpowers/specs/2026-06-07-composite-indexes-design.md\nPlan: docs/superpowers/plans/2026-06-07-composite-indexes.md",
"is_bot": false,
"headline": "feat: composite (multi-column) secondary indexes",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-11T09:08:48Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f8bec908e1e51c3844bd2a62dda2fef586ed4d3b",
"body": null,
"is_bot": false,
"headline": "test(e2e): score(n) function for FTS-driven queries",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T20:08:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "416a0378c4e9007ab9dd80611b4fd5cd39d09443",
"body": null,
"is_bot": false,
"headline": "feat(planner): validate score() arity and arg type at plan time",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T20:02:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ca1599cf229a57a43b1eac7c570c60bc166f61fa",
"body": null,
"is_bot": false,
"headline": "feat(eval): score(n) function looks up __fts_score flat key",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T19:55:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3856685965173b8b8dfb5fa99d07c760d6bf9ffb",
"body": null,
"is_bot": false,
"headline": "feat(executor): FullTextLookup emits {alias}.__fts_score per row",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T19:53:30Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c51a9ac1ed67ad3dd167219270218d6e87d17388",
"body": null,
"is_bot": false,
"headline": "refactor(fts): fulltext_lookup returns (NodeId, f64) tuples",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T19:46:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "478d854c24500d84cba4f76f5da595ab6dc1635e",
"body": null,
"is_bot": false,
"headline": "docs(conformance): note create_fulltext_index_word_multi parity in BC-11",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T14:03:01Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d94ef4e4ec13cf2600298bc831e544080cbc741c",
"body": "Add a cgo wrapper for graphdb_create_fulltext_index_word_multi on\nWriteTransaction. Marshals a Go []string of property names into a\nC array of *C.char by allocating each element with C.CString and\ndeferring C.free for each, then passes the array base pointer plus\nthe count to the C FFI.\n\nTest creates an (Article {title, body}) multi-prop index, inserts\na node, and verifies CALL fts.search('Article', '*', 'memory')\nreturns the expected row.",
"is_bot": false,
"headline": "feat(go): CreateFulltextIndexWordMulti binding",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T13:56:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "603239011680faf929aa1548ffc5444438a3b4d4",
"body": "Add a C FFI export for multi-property word fulltext indexes,\nmirroring the Database method added in Task 4. The function takes\nan array of null-terminated UTF-8 property names alongside the label,\nand routes through the existing lock_db + wrap_result scaffold used\nby the other DDL exports.\n\nExtend BC-11 conformance with a multi-prop round-trip that creates\nan Article index over (title, body), inserts a row, and verifies\nCALL fts.search('Article', '*', 'memory') returns it.",
"is_bot": false,
"headline": "feat(ffi): graphdb_create_fulltext_index_word_multi",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T13:29:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ae613ac46182b7bfd7c04b90c566d2ac47b4ffd",
"body": null,
"is_bot": false,
"headline": "feat(node): createFulltextIndexWordMulti binding",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T13:26:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4f2715419427fe349a9f6a256d61b05b480e5d83",
"body": null,
"is_bot": false,
"headline": "feat(python): create_fulltext_index_word_multi binding",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T09:42:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "74a49b347d2a83c96d006d3a9d1c3fece8ced809",
"body": null,
"is_bot": false,
"headline": "test(e2e): multi-property fts.search with wildcard and column scope",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T09:41:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5cf8bbff1a66e5261ef93e741291b92ac7ba3569",
"body": null,
"is_bot": false,
"headline": "feat(cypher): fts.search wildcard + column-scoped resolution",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T09:36:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab6eec3a42572792865b3e35f67a1c0275fd03b6",
"body": null,
"is_bot": false,
"headline": "feat(db): Database/WriteTransaction create_fulltext_index_word_multi",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T09:30:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f623af61397527f2ae7a4447551bb217506b9d9c",
"body": null,
"is_bot": false,
"headline": "feat(fts): multi-column sync in update_fts_for_node/remove_fts_for_node",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T09:28:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7959c5fe8ee27f8e258f928f5cc1e80bceed84c4",
"body": null,
"is_bot": false,
"headline": "feat(fts): create_fulltext_index_word_multi (FTS5 multi-column)",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T09:22:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2f73924e51d1434a5d01806db64fa5fe6872d5c8",
"body": null,
"is_bot": false,
"headline": "refactor(fts): FtsIndexInfo struct replaces (label, prop, kind) tuples",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T09:16:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cc42e62bcbc80591c6ebcb3b082dd502035d4df8",
"body": null,
"is_bot": false,
"headline": "docs(conformance): extend BC-11 with create_fulltext_index_word variant",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T01:19:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3e56a40aec3b1d19fd84386c69312112e0506e76",
"body": null,
"is_bot": false,
"headline": "refactor(executor): extract ProcRows type alias to satisfy clippy",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T01:19:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e539afa7d24bdfc824ebe5043a5dd22741939b9f",
"body": null,
"is_bot": false,
"headline": "feat(go): CreateFulltextIndexWord binding",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T01:11:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ea5a27c2f5ecf503beac1870d2ddc5272beb5392",
"body": null,
"is_bot": false,
"headline": "feat(ffi): graphdb_create_fulltext_index_word",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T00:24:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5ae9c4a84dbd40602ecf4bf9bf188a5d2f113ff9",
"body": null,
"is_bot": false,
"headline": "feat(node): createFulltextIndexWord binding",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-06T00:22:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dd0d513d4e43c7e1d6de7ecf9003a47f7fffe1d1",
"body": null,
"is_bot": false,
"headline": "feat(python): create_fulltext_index_word binding",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T14:36:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "063bcd43e280d61b72fb89516dfef4b8ba3c8848",
"body": null,
"is_bot": false,
"headline": "test(e2e): fts.search procedure with phrase/OR/downstream-match",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T14:35:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8335922ad1ec9a5e2abadaaa1f01fb9fae015969",
"body": "Adds the fts.search(label, property, query) built-in that yields\n(node, score) rows ranked by BM25 relevance. Issues a parameterized\nFTS5 MATCH against the underlying virtual table and negates bm25()'s\noutput so callers can use the conventional ORDER BY score DESC.\n\nSurfaces clean errors: TypeError on non-string args, IndexNotFound\nwhen no FTS index covers the pair, and ProcedureError on FTS5 syntax\nfailures.",
"is_bot": false,
"headline": "feat(cypher): fts.search built-in procedure for unicode61 indexes",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T14:29:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "89d9fa5e45a7e26fa0e784fa9e0364c23f8a0de8",
"body": "Lifts the builtin-procedure invocation into the per-record loop of\nexec_call so arg-parameterized built-ins (e.g. the upcoming\nfts.search) can read their evaluated arguments. db.indexes and\ndb.counts ignore the new slice via debug_assert.\n\nProcSource enum replaces the synthesized ProcedureDef so registry\nrows stay borrowed while builtin rows are owned per-call via Cow.",
"is_bot": false,
"headline": "refactor(executor): pass evaluated args to builtin procedures",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T14:22:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7ae5a6c1f1a001d3cc6b6155808033ba5d3c7d63",
"body": null,
"is_bot": false,
"headline": "feat(db): Database/WriteTransaction create_fulltext_index_word",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T14:16:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37dbf155a91bcb697fa8bd06b7dc21896c9b291a",
"body": "Adds a word-tokenized FTS variant backed by FTS5's unicode61 tokenizer\n(splits on word boundaries, case-folds, folds diacritics). Refactors\ncreate_fulltext_index_impl to take an FtsTokenizerSpec enum in place of\nthe binary case_sensitive bool, and extracts the tokenizer-DDL parse\nlogic into parse_tokenizer_kind so fts_tokenizer_kind and\nlist_all_fulltext_indexes share one implementation.",
"is_bot": false,
"headline": "feat(fts): create_fulltext_index_word for unicode61 tokenizer",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T14:14:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "780287829b3a29b033df94768ce6acece6ca626b",
"body": null,
"is_bot": false,
"headline": "refactor(fts): FtsTokenizerKind enum replaces is_case_insensitive",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T14:08:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5e9427b9c4914efd7d7077ae833491e48db5c156",
"body": null,
"is_bot": false,
"headline": "docs(conformance): note create_fulltext_index_ci parity in BC-11",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T03:09:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce7ae1421ba141f2561ac701a25d2fb01414e517",
"body": "Mirror the FFI graphdb_create_fulltext_index_ci entry point through the\nshared tx.ddl scaffold. New TestCreateFulltextIndexCI confirms a\ncase-mismatched CONTAINS hits the CI FTS rewrite path.",
"is_bot": false,
"headline": "feat(go): CreateFulltextIndexCI binding",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T03:03:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6aa78c2c31d91c9b78fdda833e49fc4cfa9b737a",
"body": "Add the case-insensitive fulltext index DDL to the C FFI surface,\nmirroring graphdb_create_fulltext_index via ddl_call. The cbindgen\nheader gets the new declaration on the next native build. Extends\nBC-11 conformance with a CI create + case-mismatched CONTAINS\nround-trip.",
"is_bot": false,
"headline": "feat(ffi): graphdb_create_fulltext_index_ci",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T02:38:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "329579eafc718ff09d28dcce831b1db5b4dece49",
"body": "Mirror the case-insensitive FTS index creator on the WriteTransaction\nwrapper, matching the existing create_fulltext_index shape. Add a\nparity test alongside the existing CS test in test/index_ddl.test.mjs.",
"is_bot": false,
"headline": "feat(node): create_fulltext_index_ci binding",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T02:35:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c4748c0d53c2253ebe9cfb6371ae3c3a68d2ecfb",
"body": null,
"is_bot": false,
"headline": "feat(python): create_fulltext_index_ci binding",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T02:22:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "84eaf14a77b3068dbe6b462ae34ed55b9e3f67c9",
"body": null,
"is_bot": false,
"headline": "test(e2e): case-insensitive FTS matching",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T02:21:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4553b25131db3246e8d2ba0a06c781658eb8a5e3",
"body": "Detect the symmetric `toLower(alias.prop) <fts_op> toLower(rhs)` idiom\nin WHERE predicates and gate the FullTextLookup rewrite on whether the\nmatched FTS index is case-insensitive. Plain (non-toLower) predicates\ncontinue to rewrite against either index kind; asymmetric toLower\nwrappings fall through\n[…]\ns fts_index_exists with fts_kind_for + fts_rewrite_is_usable so\nthe gating is shared by the non-correlated Scan-with-Filter path, the\ncorrelated CorrelatedJoin path, and the OR-chain → Union rewriter.",
"is_bot": false,
"headline": "feat(planner): toLower idiom + CI-index gating for FTS rewrite",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T02:15:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f5d48b4d4fc86591eda07a4f17bb07259bd45228",
"body": null,
"is_bot": false,
"headline": "feat(db): Database/WriteTransaction create_fulltext_index_ci",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T02:07:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "18b7c485f88aecd32203a66ba68899a96ffe05c3",
"body": null,
"is_bot": false,
"headline": "feat(fts): list_all_fulltext_indexes returns case-sensitivity flag",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T02:06:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0cce5ec32fc612fa4ef227349553221ae4a52fc0",
"body": null,
"is_bot": false,
"headline": "feat(fts): is_case_insensitive introspection",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T02:04:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ef3a43255d9c391d551ce2592237575ec4c06d61",
"body": null,
"is_bot": false,
"headline": "feat(fts): case-insensitive index variant",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-05T02:03:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "93b06a3c37ecdbcbe94bedea6ccb1256f03928dc",
"body": null,
"is_bot": false,
"headline": "style(schema): move migration_v3_tests module to file bottom",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T15:06:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "96303d01db74321cc71c31b6e699338d629ef1f3",
"body": null,
"is_bot": false,
"headline": "test(e2e): CALL db.counts() returns label and edge-type rows",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T15:03:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fc79f8a57bf9b6b70d6636d3aa622664209df9ad",
"body": "Adds `CALL db.counts() YIELD kind, name, count` — returns one row per\nnode label and one per edge type with their respective counts, sourced\nfrom `crate::stats`.",
"is_bot": false,
"headline": "feat(cypher): db.counts() built-in procedure",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T14:57:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b2ec56fa2c59cae0406f5b7e70c2181cd690e712",
"body": "Adds migrate_v2_to_v3 which scans all edge_props keys on first open of a\npre-v3 DB and seeds stats:edge_type_count:* counters. Fresh DBs skip the\nmigration via INSERT OR IGNORE stamping SCHEMA_VERSION=3 at init time.",
"is_bot": false,
"headline": "feat(schema): bump v2 -> v3 with edge-type count backfill",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T14:53:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b0969498f4e2c2715836203081e144a2a1c950ba",
"body": "Hook crate::stats::{increment_edge_type_count, decrement_edge_type_count_by}\ninto create_edge, delete_edge, and delete_single_edge so the edge-type\ncounters stay in sync with the actual edge_props row count.",
"is_bot": false,
"headline": "feat(edge): track per-edge-type counts on create/delete",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T14:50:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "afbfb301277e129aa4849d58029ca7d02c926a49",
"body": null,
"is_bot": false,
"headline": "feat(edge): label_from_edge_props_key helper",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T14:47:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "02ac05fe06980eae9242a15a7d18666ee6b1e973",
"body": null,
"is_bot": false,
"headline": "style(stats): cargo fmt",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T14:46:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e92cb408544c149417e6cba3c9515423d6ad6f35",
"body": null,
"is_bot": false,
"headline": "feat(stats): edge-type counters + aggregate readers",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T14:43:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b80bb2a1f56f92bbede68a38f1cb84fefbd083ea",
"body": "Migrate the Python binding to the modern `IntoPyObject` API and remove\nthe module-level `#![allow(clippy::useless_conversion)]` workaround.\nTouches `bindings/python/` only — Node, Go, and C/FFI are unaffected.\nPublic Python API surface is unchanged; 16 binding tests pass.\n\nCollateral renames absorbe\n[…]\nto satisfy 0.28's Send+Sync default (rusqlite::Connection\nis !Send; single-threaded use was already enforced via `&mut self`).\n\nCargo.lock shrinks by 23 lines (newer pyo3 has cleaner transitive deps).",
"is_bot": false,
"headline": "deps(python): upgrade pyo3 0.22 → 0.28",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T12:31:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "4d5b2626aa59180b50193230973cb1bb03699541",
"body": "`WHERE A OR B OR …` where every disjunct is a text predicate\n(CONTAINS / STARTS WITH / ENDS WITH) against an FTS-indexed property\nof the same label now plans as Union(FullTextLookup, …) with row dedup.\nReuses the existing Union IR variant (all: false → executor dedups).\nA single non-FTS-eligible disjunct disables the rewrite and the query\nfalls back to a label scan. Mixed AND/OR and the correlated form are\nnot handled in this pass.",
"is_bot": false,
"headline": "feat(planner): OR-chain rewrite across FTS indexes",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T04:37:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "30ac1b646bf644ddf4e90b0c6a8e232de6bd7aad",
"body": null,
"is_bot": false,
"headline": "style(executor): move test mod after values_match to satisfy clippy",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T02:10:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5e10e7a6346dbb5203fcc8fbf055aabf30891489",
"body": "New built-in procedure that returns `(label, property, kind)` rows for\nevery secondary and fulltext index in the database. Reuses the existing\nCALL surface — no new grammar, parser, AST, or IR. Planner and executor\nfall back to a small built-in allowlist (registry-first dispatch) after\nthe test ProcedureRegistry misses, so TCK mocks can still shadow\nbuilt-ins by name. Storage layer gains `list_all_indexes` and\n`list_all_fulltext_indexes` for all-labels enumeration.",
"is_bot": false,
"headline": "feat(cypher): index introspection via `CALL db.indexes()`",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T02:09:00Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0c59ea09f73d67bf16ed84f186bd4502510281dd",
"body": "Expose `create_index` / `drop_index` / `create_fulltext_index` /\n`drop_fulltext_index` on the WriteTransaction wrapper of the Node, Go,\nand C/FFI bindings, mirroring Python's existing PyWriteTransaction\nsurface. Each binding's method names follow language idioms (camelCase\nfor Node, PascalCase for Go, snake_case for C/FFI). Closes BC-11.",
"is_bot": false,
"headline": "feat(bindings): index DDL parity for Node/Go/C/FFI",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T01:21:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3555bc4cb909b629b24ba51f35e8a48c4d095837",
"body": "OpenCypher full-match semantics backed by Rust `regex` crate, with\nper-query bounded LRU of compiled regexes (capacity 32). NULL propagation\non either side, non-string operands evaluate to NULL, invalid patterns\nraise InvalidArgumentValue. ReDoS-safe by construction (no backreferences\nor lookaround). Runs as label scan with per-row eval; FTS indexes do not\naccelerate `=~`. See docs/cypher.md for full semantics.",
"is_bot": false,
"headline": "feat(eval): regex match operator (`=~`)",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-04T01:21:14Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5bb1568e9ab8dc60d0d3a4f8400be2bce5d6a336",
"body": "…ENDS WITH\n\nAdds `Database::create_fulltext_index(label, property)` and\n`drop_fulltext_index(...)` (plus parallel `WriteTransaction` methods and\nPython binding parity). Backed by SQLite FTS5 with the `trigram`\ntokenizer (`case_sensitive 1`), matching openCypher's case-sensitive\nsubstring semantics e\n[…]\n binding-parity project).\n\nSee docs/cypher.md \"Full-text indexes\" for full semantics + storage\ncost trade-offs and docs/superpowers/specs/2026-06-02-fulltext-index-design.md\nfor the design discussion.",
"is_bot": false,
"headline": "feat(fts): trigram-backed full-text indexes for CONTAINS/STARTS WITH/…",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-06-03T00:39:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "33392baf129ca872404dbaa7d5d8b828d4962259",
"body": "Cosmetic polish for the next release: advertise py.typed via\n'Typing :: Typed', add 'Topic :: Database' parent and\n'Intended Audience :: Developers', and surface Homepage in the\nPyPI sidebar.",
"is_bot": false,
"headline": "chore(python): add missing PyPI classifiers and Homepage URL",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-23T23:43:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "faf41a73053827fbfb0da97d00c63c323bc2fdd2",
"body": "… 2026-05-23\n\nThe IdLookup perf rewrite was logged under [Unreleased] but is part of\nthe same v0.1.1 batch as snapshot_to / py.typed / MERGE-edge docs.\nMove it under [0.1.1] and update the date from the 2026-05-17 staging\nstamp to today's date (2026-05-23) to reflect the actual release date\nthe tag will use.",
"is_bot": false,
"headline": "docs(changelog): consolidate IdLookup perf fix under [0.1.1], date as…",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-23T12:48:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "85f3ea14af413182bb00a7d5aa7da99b1c34bbfe",
"body": "Adds `LogicalOp::IdLookup` IR plus a post-planning rewrite that turns\n`Filter(Scan{\"\"}, id(alias) = expr)` into an O(1) primary-key fetch via\n`node::get_node`. Both the non-correlated form and the correlated form\n(predicate pushed *down into* a `CorrelatedJoin`'s right side) are\nhandled — the latter\n[…]\ncs of an unmatched WHERE.\n- Self-referential predicates like `WHERE id(a) = id(a)` are rejected\n by the rewrite (cannot hoist) and stay on the Scan+Filter path.\n\nCHANGELOG entry under `[Unreleased]`.",
"is_bot": false,
"headline": "feat(planner): O(1) id-lookup for `WHERE id(n) = expr`",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-18T22:01:38Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5f4e35e96e00ff4d2827f2f9fd045b46ed2cf3fa",
"body": "…MERGE\n\nStage the v0.1.1 release on main without tagging. CHANGELOG dated\n2026-05-17; tag whenever there's a consumer-driven reason to ship.\n\nVersion bumps:\n- Cargo.toml (workspace), bindings/node/package.json,\n bindings/python/python/graphdblite/__init__.py: 0.1.0 → 0.1.1\n\nDocumentation:\n- docs/py\n[…]\n CREATE / ON MATCH SET r += $props, edge identity semantics, and\n direction sensitivity. Replaces the asymmetric per-binding edge-MERGE\n examples that previously lived only in python.md and node.md.",
"is_bot": false,
"headline": "release(prep): v0.1.1 — bump versions, document snapshot_to and edge …",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-17T16:14:39Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "9548925cd5c4ebaca0eb2cfbaf93e8d168e59d05",
"body": "Adds a py.typed marker plus a complete __init__.pyi covering Database,\nWriteTransaction, ReadTransaction, the exception hierarchy, batch APIs,\nand the optional params argument on query / execute. Re-exports the\ntransaction classes and exceptions from the top-level graphdblite\npackage so they resolve without reaching into _graphdblite.\n\nDownstream consumers can drop their `# type: ignore[import-untyped]`\nworkarounds once this ships.",
"is_bot": false,
"headline": "feat(python): ship PEP 561 typing — py.typed marker + full stubs",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-17T13:30:31Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8147ce8048dfba6938c286869d634ed3316c7725",
"body": "Add regression tests for MERGE edge upsert with ON CREATE/ON MATCH and\nfor inline-prop discrimination of parallel edges. Extend Python and Node\ndocs with the edge-upsert example so users don't need to guess whether\nMERGE works on relationships.",
"is_bot": false,
"headline": "docs+tests: confirm MERGE edge upsert semantics",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-17T12:59:50Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ecc1d2a8e02a3e1590a1497572cdc2c7874aa2c5",
"body": "Adds Database::snapshot_to(path) — a single-file consistent copy of the\ndatabase via SQLite's VACUUM INTO. Produces a self-contained file with no\n-wal / -shm sidecars, defragmented and compacted. Rejects when a\ntransaction is active or when the destination path already exists.\n\nExposed in all bindin\n[…]\nnapshotTo\n\nEach surface has matching tests (basic round-trip, rejects existing\ntarget, rejects with active tx). Subsumes the standalone checkpoint()\nask since VACUUM INTO checkpoints as a side effect.",
"is_bot": false,
"headline": "feat: add snapshot_to API across Rust core and all bindings",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-17T12:59:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "296d39bfcac039c819937c9ffe6ab21815978551",
"body": "The previous commit serialized the two heavy stress tests with a\nMutex so they wouldn't pile their child processes on top of each\nother. That reduced flake probability but missed the root cause:\nthe children treated SQLITE_BUSY as a panic.\n\nSQLITE_BUSY is a normal, recoverable signal under multi-pro\n[…]\ns commit (pure\n improvement, surfaces panic messages on failure).\n\nMulti-process safety is still verified inside each scenario — the\nparent's final assertions on exact node/edge counts haven't moved.",
"is_bot": false,
"headline": "test(multiprocess): retry SQLITE_BUSY in children, drop the mutex",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-17T12:20:06Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "8af021c71ca0e934176d133f938ff169e3677b00",
"body": "Two issues addressed:\n\n1. concurrent_writers (4 child procs) and stress_writers_with_readers\n (10 child procs) previously ran in parallel within the same test\n binary. Combined with cargo's cross-binary parallelism that meant\n 14+ SQLite-writing processes from one binary plus everything else\n \n[…]\n inherited and swallowed by cargo's test-output capture. Now\n the parent pipes child stderr and prints the captured panic\n message on failure, so future flakes are diagnostic instead of\n opaque.",
"is_bot": false,
"headline": "test(multiprocess): serialize stress tests + capture child stderr",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-17T12:04:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "d6eabbc01c763d50440514e43070c57209de6056",
"body": "PyPI and npm rendered empty long-description sections on the v0.1.0\npackage pages because neither pyproject.toml nor the npm package\nincluded a README. Adds:\n\n- bindings/python/README.md (user-facing intro: install, quick start,\n cypher snippet, links back to repo).\n- bindings/python/pyproject.toml\n[…]\not bumping the version — this lands now for the next release\n(v0.1.1). The crates.io page already renders the root README via\nCargo workspace inheritance; pkg.go.dev already has bindings/go/README.md.",
"is_bot": false,
"headline": "docs(bindings): add user-facing READMEs for Python and Node packages",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T17:46:20Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "49d1fcb22fb14ec4f0a48667872df46903cd3e63",
"body": "The release-go.yml workflow and docs/publishing.md were both using\n\\`vX.Y.Z-go\\` as the Go-module tag. Go's module spec requires\nsubdirectory modules to be tagged with the subdir path as a prefix\n(\\`bindings/go/vX.Y.Z\\`); the bare/suffix form is not recognized by\nproxy.golang.org or pkg.go.dev for s\n[…]\nop prevention), so release-go.yml needs a manual\ndispatch for the first release after publish-tag-release runs. Update\ndocs/publishing.md to recommend \\`gh workflow run release-go.yml -f tag=vX.Y.Z\\`.",
"is_bot": false,
"headline": "docs+ci(go): fix Go-module tag to bindings/go/vX.Y.Z",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T17:01:05Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "2489d85e1c77602ab3f568db54e348e2813429bb",
"body": "The publish-npm job invoked `napi create-npm-dirs` (plural), which v2.x\ndoesn't accept. Verified locally — singular plus `-t .` iterates all\ntriples from package.json and creates per-platform dirs.",
"is_bot": false,
"headline": "fix(ci): napi-rs v2 CLI is `create-npm-dir` (singular)",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T16:25:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "254e99cdd2dfbd51f6386928d12c12a9f949a423",
"body": "Three changes that together make tag-push the canonical release path\nfor the npm package, mirroring what python-wheels.yml does for PyPI:\n\n- bindings/node/package.json: add the two musl triples\n (x86_64-unknown-linux-musl, aarch64-unknown-linux-musl) to the napi\n triples list so napi-rs creates pe\n[…]\ncan migrate to OIDC).\n- .github/workflows/python-wheels.yml: add skip-existing: true to\n the PyPI publish step so re-firing the tag against an already-\n published version no-ops instead of erroring.",
"is_bot": false,
"headline": "ci: wire npm publish into Build & Release on tag push",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T15:50:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "80f6bc00c6d52d7677849c6fb7674d528bea9fa4",
"body": "maturin's sdist build pulled the workspace root LICENSE in via Cargo\nlicense.workspace = true, AND the per-package bindings/python/LICENSE\nvia the pyproject.toml license-files directive — both targeted at\ngraphdblite-0.1.0/LICENSE inside the sdist, which maturin rejects as\na duplicate.\n\nDelete the p\n[…]\nENSE and bindings/node/LICENSE stay — Go modules and\nnpm packages each ship as standalone artifacts that pkg.go.dev and\nnpm display their own LICENSE for. Only the Python case had the\nsdist collision.",
"is_bot": false,
"headline": "fix(python): drop duplicate bindings/python/LICENSE to unblock sdist",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T14:52:23Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "764990115d240d1399ebe8636bb9f56ed48901bd",
"body": "Replace the placeholder \\\"First public release.\\\" with sections covering\ncore (embedded SQLite/WAL/ACID), query language (Cypher + 100% TCK),\ntypes (temporal + values), transactions (stateful + RAII), storage\n(adjacency-list + indexes), language bindings (Rust/Python/Node/Go/C),\nand the locked-down public API surface. Also bump the date from\n2026-05-15 to 2026-05-16 to match the actual tag day.",
"is_bot": false,
"headline": "docs: write a real 0.1.0 changelog entry",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T14:20:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b4f6e187cd6a45274d19e3891b346bf18c19a207",
"body": "The mlugg/setup-zig action runs on the Node.js 20 actions runtime, which\nGitHub force-migrates to Node 24 on 2026-06-02 (17 days from now) and\nremoves entirely 2026-09-16. The setup-zig project has moved primary\nhosting to Codeberg per the v2.2.1 release notes, so the GitHub mirror\nis unlikely to sh\n[…]\ni-rs uses zig as the\nC cross-compiler.\n\nPinned to ZIG_VERSION=0.14.1 — manual bumps when needed; Zig is only\na build dep here, not part of the published surface, so reproducibility\nbeats auto-updates.",
"is_bot": false,
"headline": "ci: inline zig install; drop mlugg/setup-zig@v2 ahead of Node 20 sunset",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T13:07:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3c1ad681e44029f7be9f80a75a2800bbcb852875",
"body": "Cuts STABILITY.md from 179 to 37 lines. The trim drops content that\neither drifts faster than the doc (per-item public-surface listing —\ncargo doc is authoritative), overpromises (per-signature stability\ntable at pre-1.0), or duplicates other docs (binding compliance —\nthat's BINDING_CONFORMANCE.md'\n[…]\nr before 1.0\"),\nwhat's public vs pub(crate), soundness guarantees that are enforced\nin code, and the security note for binding authors about untrusted\npaths. That's what callers actually need to know.",
"is_bot": false,
"headline": "docs(stability): trim to minimum; don't overpromise pre-1.0",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T12:24:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6865ab256af220fcde27978c14c3da1b744e1bc9",
"body": "bindings/ffi/build.rs skips cbindgen when HOST != TARGET and falls back\nto copying a pre-existing bindings/ffi/graphdblite.h. Cross-compiled\nFFI builds (linux musl, linux aarch64, macos x86_64 from arm64 host,\nwindows-gnu from MSVC host) had no header on disk so the Package step\nfailed with: cp: can\n[…]\n/ffi/graphdblite.h.\n\nAdd an explicit host `cargo check -p graphdblite-ffi` before the\ntarget build to run build.rs natively and produce the header. Cheaper\nthan `cargo build` since check doesn't link.",
"is_bot": false,
"headline": "ci: pre-generate FFI header on host before cross builds",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T03:50:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c8cdbeb76add74c468e061bf76220aaaeeda0027",
"body": "…odes\n\nRename Dev Build → Build & Release. Two trigger modes share one matrix:\n - workflow_dispatch → republishes rolling `dev-latest` prerelease\n - push of a v* tag → publishes a fixed release at that tag\n\nCLI / FFI / Node addon matrices now cover the same 7 targets the wheels\nmatrix already \n[…]\n-only filler for the old\nlocal-build flow) — its job is subsumed.\n\nUpdates docs/publishing.md to point at the CI flow as the canonical\nrelease path; scripts/publish-release.sh kept for forgejo mirror.",
"is_bot": false,
"headline": "ci: extend Build & Release to full 7-platform matrix; split publish m…",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T03:19:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3ddf779725822cacb29d1dd21a776d63cd6c939f",
"body": "CI failure on commit 05f18a2: dropping `pub mod procedures` from the\npublic surface broke the in-crate tck_support module, which had\nimported through that public path. The pre-push gate didn't catch it\nbecause `cargo test --workspace` doesn't enable any features and the\ntck_support module is gated b\n[…]\nfeatures` before the test step so feature-gated\nmodules (tck-support, dhat-heap, fuzzing) get type-checked locally\nbefore push. This is the only thing that would have caught the\nupstream import break.",
"is_bot": false,
"headline": "fix(tck): rewire tck_support imports through crate::cypher::procedure",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T02:40:54Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "05f18a2b8dca17383a668a354b5080ee5e867468",
"body": "No first-party binding consumes the procedure registry — the TCK harness\nis the only caller and reaches it through pub(crate) paths. Exposing the\nshape now would commit to an API designed against a mocks-only workload,\nahead of any real use case. Removing it from 0.1.0 keeps the public\nsurface minimal and leaves room to design it properly when a binding\nactually needs it.\n\nPublic surface is now just `pub mod graphdblite` (per cargo public-api).",
"is_bot": false,
"headline": "chore(api): drop procedures::* from public surface for 0.1.0",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T02:04:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cb48bf277834feaea6c123d9f6f660f77ba4a370",
"body": "Three findings from cargo public-api review against STABILITY.md:\n\n- graphdblite::types was a fully public module path, exposing the\n validate_name/validate_name_length/validate_properties internal\n helpers and a second name for every re-exported type. Drop to\n pub(crate); add Result to the root \n[…]\nperimental\"\n to match its actual state (TCK harness is the only consumer).\n\nREADME: one-line clarifier on cargo install (CLI) vs cargo add\n(library) — both appeared in the README without explanation.",
"is_bot": false,
"headline": "chore(api): tighten public surface ahead of 0.1.0",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T01:29:59Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "3126c4426b21c6096ac32ba4287c3c4d46ff42d4",
"body": "- Add [package].exclude for tests/tck/features, tests/tck/graphs, and\n skiplist.txt. These are TCK fixtures consumed only by the tck-support\n test binary; bundling them in the crates.io tarball tripled its size\n for no downstream benefit. Package drops from 374 files / 500 KiB to\n 148 files / 37\n[…]\n and not used by our build (rules out scripts/); contrib/ is the\n conventional home for supplementary files destined for external tools.\n- Update the sole reference in docs/sqlite-application-id.md.",
"is_bot": false,
"headline": "chore: shrink published crate and relocate sqlite-magic.patch",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T01:02:30Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ee5407e5a8f19717a5e41454e07d0291ce4c3c29",
"body": "… into docs/\n\n- Remove public-api.txt and the cargo-public-api CI job. Public surface\n drift will be reviewed manually during release prep instead of via a\n committed snapshot; STABILITY.md updated accordingly.\n- Remove justfile. It was a thin wrapper over scripts/publish-release.sh\n and docker c\n[…]\n is the active path. Restore from local backup if Forgejo\n CI is resumed.\n- Move SPEC.md to docs/spec.md (it's reference doc, not landing\n material) and add a README link so it's actually navigable.",
"is_bot": false,
"headline": "chore: prune public-api gate, justfile, .forgejo workflows; move SPEC…",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-16T00:24:13Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a6eecd9cac66d34df30d9f870d8a29b14b3e9893",
"body": "…e-magic.patch out of docs\n\npython-wheels.yml previously only built macOS wheels and was\nworkflow_dispatch only — so a tag push wouldn't actually publish\nanything to PyPI without a separate manual step. The expected\n'local-built linux/windows + CI macOS' flow was never wired up.\n\nReplaced with a tag\n[…]\nwn; the patch is a project-authored artifact\nthe maintainer will eventually mail to drh@sqlite.org for upstream\nfile(1) magic-byte registration. Updated the reference in\ndocs/sqlite-application-id.md.",
"is_bot": false,
"headline": "ci+chore: rebuild python-wheels.yml for full PyPI publish; move sqlit…",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-15T23:29:00Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "74d83d4ac515c046aa0dbecc782f1771af12d05c",
"body": null,
"is_bot": false,
"headline": "chore(gitignore): exclude docs/superpowers/ — internal AI planning docs",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-15T23:19:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "535db935b21cafb24514d38ddd005e04450c5089",
"body": "The zig-wheels service produced Linux Python wheels via cargo-zigbuild,\nwhich broke against Rust 1.95's ELF layout (lld in cargo-zigbuild 0.22.2\nmishandled section sizes — sh_size 0x20000000000063 etc). manylinux is\nPyPA's official wheel-portability spec and works without zig, so this\nswap aligns lo\n[…]\nnto every container.\n\nVerified: all four wheels produced cleanly with proper manylinux_2_28 /\nmusllinux_1_2 tags. Each ~2.8-3.0 MiB. aarch64 builds take ~14 min\nunder qemu vs ~5 min native for x86_64.",
"is_bot": false,
"headline": "build: replace zig-wheels with PyPA manylinux/musllinux services",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-15T22:39:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "576fc2f5f5d6af53282d7477e1b74a5a5b49fccc",
"body": "One column-header drift caught by the release-time test gate:\n\n Return6 - Implicit grouping with aggregates::[17]\n - golden: 38 + avg(person.age) - 1000\n + actual: $age + avg(person.age) - 1000\n\nThis is an intentional consequence of the plan-cache work (commit\n'feat(plan-cache): param-agnostic planner via LookupKey + EvalCx').\nColumn names now reflect the query as written rather than the\nresolved parameter value, so the same cached plan is reusable\nacross all $age values.",
"is_bot": false,
"headline": "test: bless record_columns_golden for param-agnostic planner",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-15T12:09:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "426b6a241c2db1877c1b5da9821e1f559f779e8e",
"body": "- Replaces legacy author identity with 'ds7n' in 15 working-tree files:\n - LICENSE files (root + 4 binding subdirs)\n - SPDX header comments in 7 source files\n - bindings/python/pyproject.toml authors field\n - bindings/node/package.json author field\n - docs/publishing.md examples\n- CHANGELOG.md \n[…]\nst.\n\nNote: a fictional actor-name reference remains in\ntests/tck/features/clauses/create/Create4.feature — that's a\nvendored openCypher TCK fixture\n(Matrix-themed scenario), not an identity reference.",
"is_bot": false,
"headline": "chore: scrub legacy author identity and strip v0.1.0 CHANGELOG body",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-15T02:59:45Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "b6d97f0b559ac21c254764ac2fa03a507d2b61d2",
"body": "- Cargo.toml: add workspace-level repository/homepage/documentation/\n readme/keywords/categories (required for proper crates.io listing).\n- pyproject.toml: add authors, keywords, classifiers (incl. Python\n 3.10-3.13), and [project.urls] for PyPI.\n- package.json: add author, keywords, homepage, rep\n[…]\n- 2026-05-15. Fixed stale\n MSRV mention (was '1.82 (required by Option::is_none_or)'; now 1.90).\n\nValidated: `cargo publish --dry-run` packages clean (381 files, 519 KiB\ncompressed) with no warnings.",
"is_bot": false,
"headline": "release: prepare v0.1.0 metadata and changelog",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-15T02:37:43Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "f492f25c42753a6b6599e4d8b8eadc45a0f5235c",
"body": "The 1.82 -> 1.85 bump earlier today resolved the indexmap/clap_builder/\ngetrandom cascade but the very next test run hit napi-build@2.3.1\nrequiring rustc 1.88, proving 1.85 was already too tight on the day\nwe chose it. Going to 1.90 (released ~Aug 2025, ~9 months old) gives\nmeaningful headroom against the next dep cascade while staying well\nwithin the practical install base. The \"recommended\" toolchain is\nwhatever 'stable' resolves to in CI — currently 1.95.",
"is_bot": false,
"headline": "build: bump MSRV from 1.85 to 1.90",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-13T01:40:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d0261f6c11a0a39f7c895928f0a28e5e86bd6c84",
"body": null,
"is_bot": false,
"headline": "ci: pin astral-sh/setup-uv to v8.1.0 (no floating major tag exists)",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-13T01:22:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "17f34b2309375be6702dfe683530b65b7713b9e8",
"body": null,
"is_bot": false,
"headline": "ci(full-matrix): comment out macos-latest to conserve credits",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-13T01:18:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d911271abcdbcbb5c5c3de06854b8a467648628d",
"body": "GitHub Actions deprecated Node.js 20 (forced to Node 24 starting\nJune 2 2026, removed September 16 2026). Bumps all first-party and\nknown third-party actions to their latest major:\n\n actions/checkout v4 -> v6\n actions/setup-node v4 -> v6\n actions/setup-go v5 -> v6\n actions/upload\n[…]\nDependencies file is not\nfound ... Supported file pattern: go.sum\" warning by passing\n`cache: false` to actions/setup-go — the Go binding has no\nnon-stdlib deps so there's nothing meaningful to cache.",
"is_bot": false,
"headline": "ci: bump actions to Node 24-compatible majors",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-13T01:14:17Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c8117e86ab34fc9d6683e2ae153324230968bf6c",
"body": "ci.yml runs on every push to main + every PR — gives external\ncontributors green/red checks on their PRs regardless of whether\nthe self-hosted Forgejo runner is up.\n\nci-full.yml runs weekly (Mon 07:00 UTC) + on push to main; skipped\non PRs to avoid burning matrix runners on every iteration.\n\nWorkflows were previously workflow_dispatch only and disabled on\ngithub; with these triggers they'll auto-run on the next push.",
"is_bot": false,
"headline": "ci: add push/PR triggers to github CI workflows",
"author_name": "ds7n",
"author_login": "ds7n",
"committed_at": "2026-05-13T01:06:31Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 4,
"commits_last_year": 421,
"latest_release_at": "2026-07-08T17:46:15Z",
"latest_release_tag": "v0.1.2",
"releases_from_tags": false,
"days_since_last_push": 14,
"active_weeks_last_year": 10,
"days_since_latest_release": 18,
"mean_days_between_releases": 16.9
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": false,
"has_contributing": false,
"health_percentage": 28,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "graphdblite",
"exists": true,
"license": "MIT",
"keywords": [
"cypher",
"database",
"embedded",
"graph",
"sqlite",
"database",
"database-implementations"
],
"ecosystem": "crates",
"matches_repo": true,
"registry_url": "https://crates.io/crates/graphdblite",
"is_deprecated": false,
"latest_version": "0.1.2",
"repository_url": "https://github.com/ds7n/graphdblite",
"versions_count": 3,
"total_downloads": 56,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 19,
"first_published_at": "2026-05-16T16:33:49.925848Z",
"latest_published_at": "2026-07-09T01:49:42.749992Z",
"latest_version_yanked": false,
"days_since_latest_publish": 18
}
]
},
"popularity": {
"forks": 0,
"stars": 2,
"watchers": 1,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": false,
"bootstrap_files": [
"bindings/ffi/Makefile",
"bindings/go/Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [
"bindings/python/python/graphdblite/py.typed"
],
"toolchain_manifests": [
"Cargo.toml",
"benches-crate/Cargo.toml",
"bindings/ffi/Cargo.toml",
"bindings/go/go.mod",
"bindings/node/Cargo.toml",
"bindings/python/Cargo.toml",
"fuzz/Cargo.toml"
],
"largest_source_bytes": 180880,
"source_files_sampled": 116,
"oversized_source_files": 2,
"agent_instruction_files": [],
"agent_instruction_max_bytes": null
},
"dependencies": {
"manifests": [
"Cargo.toml",
"benches-crate/Cargo.toml",
"fuzz/Cargo.toml"
],
"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": [
"crates"
],
"dependencies": [
{
"name": "rusqlite",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.32"
},
{
"name": "rmp-serde",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1"
},
{
"name": "serde",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1"
},
{
"name": "indexmap",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "2"
},
{
"name": "pest",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "2"
},
{
"name": "pest_derive",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "2"
},
{
"name": "regex",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1"
},
{
"name": "chrono",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.4.44"
},
{
"name": "chrono-tz",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.10.4"
},
{
"name": "tracing",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.1"
},
{
"name": "cucumber",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.21"
},
{
"name": "anyhow",
"manifest": "Cargo.toml",
"ecosystem": "crates",
"version_constraint": "1"
},
{
"name": "graphdblite",
"manifest": "benches-crate/Cargo.toml",
"ecosystem": "crates",
"version_constraint": null
},
{
"name": "tempfile",
"manifest": "benches-crate/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "3"
},
{
"name": "criterion",
"manifest": "benches-crate/Cargo.toml",
"ecosystem": "crates",
"version_constraint": "0.5"
}
],
"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": 1,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "ds7n",
"commits": 421,
"avatar_url": "https://avatars.githubusercontent.com/u/270055197?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"audit.yml",
"bench.yml",
"ci-full.yml",
"ci.yml",
"dev-build.yml",
"python-wheels.yml",
"release-go.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"Cargo.lock",
"package-lock.json"
],
"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": 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": 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": 10,
"reason": "packaging workflow 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": 0,
"reason": "Project has not signed or included provenance with any releases.",
"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": 6,
"reason": "4 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "124fc33af5c66abde15d3883489f85d788d47b00",
"ran_at": "2026-07-27T04:07:08Z",
"aggregate_score": 4.1,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-20T10:19:29Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-05-08T13:15:42Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/ds7n/graphdblite",
"host": "github.com",
"name": "graphdblite",
"owner": "ds7n"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"security": 41,
"vitality": 74,
"community": 23,
"governance": 46,
"engineering": 58
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 74,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 64,
"inputs": {
"commits_last_year": 421,
"human_commit_share": 1,
"days_since_last_push": 14,
"active_weeks_last_year": 10
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 14 days ago",
"points": 28.8,
"status": "partial",
"details": [
{
"code": "push_recency",
"params": {
"days": 14
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "10/52 weeks with commits",
"points": 6.9,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 10
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "421 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 421
}
}
],
"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": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 4,
"latest_release_tag": "v0.1.2",
"releases_from_tags": false,
"days_since_latest_release": 18,
"mean_days_between_releases": 16.9
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "4 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 4
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 18 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 18
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~16.9 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 16.9
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"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": 23,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 1,
"inputs": {
"forks": 0,
"stars": 2,
"watchers": 1,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "2 stars",
"points": 0,
"status": "missed",
"details": [
{
"code": "stars",
"params": {
"count": 2
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "1 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 1
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (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": 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
}
]
},
{
"key": "ecosystem_adoption",
"band": "critical",
"name": "Ecosystem adoption (downloads)",
"note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"registry_dependents"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 22,
"inputs": {
"packages": [
"graphdblite"
],
"dependents": null,
"ecosystems": "crates",
"total_downloads": 56,
"monthly_downloads": 19
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "19 downloads/month across crates",
"points": 17.3,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 19,
"ecosystems": "crates"
}
}
],
"max_points": 80
},
{
"key": "registry_dependents",
"name": "Registry dependents",
"detail": "not reported by this ecosystem",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_reported_by_this_ecosystem",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "at_risk",
"name": "Sustainability & Governance",
"value": 46,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 10,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"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 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 0 contributing companies or organizations -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 72,
"inputs": {
"merged_prs": 1,
"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": "1/1 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 1,
"decided": 1
}
}
],
"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": 25,
"inputs": {
"followers": 2,
"owner_type": "User",
"is_verified": null,
"owner_login": "ds7n",
"public_repos": 5,
"account_age_days": 127
},
"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": "2 followers of ds7n",
"points": 3.4,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 2,
"login": "ds7n"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "5 public repos, account ~0 yr old",
"points": 6.4,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 5
}
},
{
"code": "account_age_years",
"params": {
"years": 0
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 92,
"inputs": {
"packages": [
"graphdblite"
],
"ecosystems": "crates",
"any_deprecated": false,
"min_days_since_publish": 18
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on crates",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "crates"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 18 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 18
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "3 published versions",
"points": 12,
"status": "partial",
"details": [
{
"code": "published_versions",
"params": {
"count": 3
}
}
],
"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": 58,
"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": "7 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 7
}
}
],
"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": "moderate",
"name": "Documentation",
"note": null,
"notes": [],
"value": 55,
"inputs": {
"topics": [],
"has_wiki": false,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 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": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 41,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 41,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 17,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 1,
"scorecard_aggregate": 4.1
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "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 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": "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 detected",
"points": 5,
"status": "met",
"details": [],
"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": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"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": "4 existing vulnerabilities detected",
"points": 4.5,
"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": 57,
"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": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 61,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"Cargo.lock",
"package-lock.json"
],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [
"bindings/ffi/Makefile",
"bindings/go/Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [
"bindings/python/python/graphdblite/py.typed"
],
"agent_commit_share": 0,
"toolchain_manifests": [
"Cargo.toml",
"benches-crate/Cargo.toml",
"bindings/ffi/Cargo.toml",
"bindings/go/go.mod",
"bindings/node/Cargo.toml",
"bindings/python/Cargo.toml",
"fuzz/Cargo.toml"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "bindings/ffi/Makefile, bindings/go/Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "bindings/ffi/Makefile, bindings/go/Makefile"
}
}
],
"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": "bindings/python/python/graphdblite/py.typed",
"points": 11,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "bindings/python/python/graphdblite/py.typed"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile, lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile, 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": 99,
"inputs": {
"primary_language": "Rust",
"largest_source_bytes": 180880,
"source_files_sampled": 116,
"oversized_source_files": 2
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Rust (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Rust"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "2/116 source files over 60KB",
"points": 54.1,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 116,
"oversized": 2
}
}
],
"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": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"Could not fetch crates package 'graphdblite-bench' from its registry",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-27T04:07:13.623052Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/ds7n/graphdblite.svg",
"full_name": "ds7n/graphdblite",
"license_state": "standard",
"license_spdx": "MIT"
}