JSON-Rohbericht maschinenlesbar
{
"data": {
"repo": {
"topics": [
"agent-memory",
"ai-agents",
"c",
"claude",
"claude-code",
"database",
"docker",
"embeddings",
"llm",
"mcp",
"memory",
"semantic-search",
"tcp",
"vector-search"
],
"is_fork": false,
"size_kb": 1604,
"has_wiki": false,
"homepage": "https://d4n-larsson.github.io/aegisdb/",
"languages": {
"C": 772009,
"CSS": 2722,
"HTML": 66211,
"CMake": 4692,
"Shell": 5309,
"Python": 369533,
"Makefile": 13887,
"Dockerfile": 4049
},
"pushed_at": "2026-07-28T21:25:28Z",
"created_at": "2026-06-27T07:47:24Z",
"owner_type": "User",
"updated_at": "2026-07-28T21:23:56Z",
"description": "A fast, single-binary C database that gives AI agents durable, searchable long-term memory — with a Claude Code integration. ",
"is_archived": false,
"is_disabled": false,
"license_spdx": "MIT",
"default_branch": "main",
"license_spdx_raw": "MIT",
"primary_language": "C",
"significant_languages": [
"C",
"Python"
]
},
"owner": {
"blog": null,
"name": "Dan Larsson",
"type": "User",
"login": "d4n-larsson",
"company": "LTG Display",
"location": "Stockholm",
"followers": 3,
"avatar_url": "https://avatars.githubusercontent.com/u/161018631?v=4",
"created_at": "2024-02-23T09:40:11Z",
"is_verified": null,
"public_repos": 1,
"account_age_days": 886
},
"license": {
"state": "standard",
"spdx_id": "MIT",
"raw_spdx": "MIT",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.5.5",
"kind": "patch",
"published_at": "2026-07-28T20:36:30Z"
},
{
"tag": "v0.5.4",
"kind": "patch",
"published_at": "2026-07-28T09:33:15Z"
},
{
"tag": "v0.5.3",
"kind": "patch",
"published_at": "2026-07-28T08:07:01Z"
},
{
"tag": "v0.5.2",
"kind": "patch",
"published_at": "2026-07-28T07:46:25Z"
},
{
"tag": "v0.5.1",
"kind": "patch",
"published_at": "2026-07-26T10:09:24Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-07-26T07:27:20Z"
},
{
"tag": "v0.5.0-beta.1",
"kind": "prerelease",
"published_at": "2026-07-25T10:37:39Z"
},
{
"tag": "v0.4.11",
"kind": "patch",
"published_at": "2026-07-24T10:50:17Z"
},
{
"tag": "v0.4.10",
"kind": "patch",
"published_at": "2026-07-23T16:09:17Z"
},
{
"tag": "v0.4.9",
"kind": "patch",
"published_at": "2026-07-22T07:40:33Z"
},
{
"tag": "v0.4.8",
"kind": "patch",
"published_at": "2026-07-14T12:30:13Z"
},
{
"tag": "v0.4.7",
"kind": "patch",
"published_at": "2026-07-13T09:14:35Z"
},
{
"tag": "v0.4.6",
"kind": "patch",
"published_at": "2026-07-12T14:15:02Z"
},
{
"tag": "v0.4.5",
"kind": "patch",
"published_at": "2026-07-12T12:47:02Z"
},
{
"tag": "v0.4.4",
"kind": "patch",
"published_at": "2026-07-10T12:46:43Z"
},
{
"tag": "v0.4.3",
"kind": "patch",
"published_at": "2026-07-10T09:52:48Z"
},
{
"tag": "v0.4.2",
"kind": "patch",
"published_at": "2026-07-09T09:26:28Z"
},
{
"tag": "v0.4.1",
"kind": "patch",
"published_at": "2026-07-08T21:20:26Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-07-06T07:43:39Z"
},
{
"tag": "v0.3.4",
"kind": "patch",
"published_at": "2026-06-30T07:31:49Z"
},
{
"tag": "v0.3.3",
"kind": "patch",
"published_at": "2026-06-28T20:50:55Z"
},
{
"tag": "v0.3.2",
"kind": "patch",
"published_at": "2026-06-28T20:01:29Z"
},
{
"tag": "v0.3.1",
"kind": "patch",
"published_at": "2026-06-28T19:37:05Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-06-28T18:48:56Z"
},
{
"tag": "v0.2.0",
"kind": "minor",
"published_at": "2026-06-28T17:42:27Z"
},
{
"tag": "v0.1.0",
"kind": "minor",
"published_at": "2026-06-28T13:58:58Z"
}
],
"recent_commits": [
{
"oid": "f3ddf1f9ee341ee478824a71e06478bd2b879b37",
"body": "docs: v0.5.6 release notes (MCP 2.x support + CI coverage)",
"is_bot": false,
"headline": "Merge pull request #228 from d4n-larsson/docs/release-v0.5.6",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T21:23:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "90bf48d703aee00961a3cfd5cc7e8b637d411de9",
"body": "A compatibility-and-testing release for the Claude Code integration. Lifts\nv0.5.5's `mcp<2` cap now that server.py supports both SDK majors, and records\nthe CI gaps closed since: both majors gated in the first-contact walk, the\nintegration's 137 tests running in ci.yml, and the declared Python floor\n[…]\nrelease is not urgent and that the C server is\nbuilt from the same sources as v0.5.4 — the image differs only in its version\nstring.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add v0.5.6 release notes (MCP 2.x support + CI coverage)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T21:22:41Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "6409e9e69a97142113dbd4e0901337dd87bc76a3",
"body": "ci: run the Claude Code integration suite",
"is_bot": false,
"headline": "Merge pull request #227 from d4n-larsson/ci/claude-code-tests",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T21:16:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "38b071bc7bbd56da70dbd1e7c25685451b8de6c1",
"body": "The integration's 137 tests (unit + contract + integration) have never run in\nCI — `ci.yml` covered the C server and the Prometheus exporter, and its PR path\nfilter did not even include `integrations/claude-code/**`, so a change confined\nto that tree triggered no test job at all. The mcp-2.0 break a\n[…]\ng as the unbounded\n `mcp>=1.0`. Verified locally on 3.10.20: 137 pass.\n- Added `integrations/claude-code/**` to the PR path filter.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: run the Claude Code integration suite",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T21:13:04Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "eada915e0ba6f971ae0e234a4e6baccb7b7336b4",
"body": "Port the MCP binding to the 2.x SDK and lift the version cap",
"is_bot": false,
"headline": "Merge pull request #226 from d4n-larsson/feat/mcp-2x",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T21:07:48Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b74c280bf2bd38d217f655afa4ae062c7a62437b",
"body": "Ports server.py to mcp 2.x and restores a range that spans both majors, so a\nfresh install tracks the current SDK instead of being held at 1.x.\n\nmcp 2.0 renamed FastMCP to MCPServer and moved it to `mcp.server.mcpserver`.\nFor this binding that is the whole difference: the constructor, the `@tool()`\n\n[…]\nt-contact walk passes on mcp 2.0.0 (serverInfo version\n0.0.0+first.contact) and on mcp 1.29.0; integration suite (137 tests) passes.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(mcp): support the 2.x SDK API and lift the version cap",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T21:05:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "d065824e96017bf3f0d1a694e8f1bfe05c6f5fbf",
"body": "docs: v0.5.5 release notes (MCP install fix)",
"is_bot": false,
"headline": "Merge pull request #225 from d4n-larsson/docs/release-v0.5.5",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T20:33:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6016b45150c25be20b924e84af3ac537a597b0d2",
"body": "A fix release for the Claude Code integration only — the C server is\nunchanged. Ships the `mcp>=1.0,<2` cap so a fresh `uvx aegisdb-mcp` can start,\nplus the first-contact CI gate that caught it.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add v0.5.5 release notes (MCP install fix)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T20:32:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "9380fa5f05ae066379ba7887dfdf3a94adb4a210",
"body": "Gate the documented quickstart, and fix the mcp 2.0 break it found",
"is_bot": false,
"headline": "Merge pull request #224 from d4n-larsson/ci/first-contact",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T20:30:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "86c0d277aa81eb0eea894ff6d761f31d291c2468",
"body": "The quickstart is the one path a launch visitor is guaranteed to run, and\nnothing covered it: the C suites never touch the container image, and the\nintegration's contract tests call MemoryTools in-process, so they exercise\nneither the installed console scripts nor the MCP stdio protocol. The mcp-2.0\n[…]\nublished` stays red until a release carries the parent commit's cap —\nthat is a true report of the live PyPI break, not a flaky job.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: gate the documented quickstart with a first-contact check",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T20:27:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0f93b9358632391f659c511da01e241edc5781f2",
"body": "`uvx aegisdb-mcp` — the command in the README and in the .mcp.json that\n`aegisdb-init` writes — currently fails to start for every new user. The\ndependency was `mcp>=1.0`, which resolves to mcp 2.0.0; 2.0 removed\n`mcp.server.fastmcp` in favour of `mcp.server.mcpserver.MCPServer`, so\nserver.py's impo\n[…]\nthey already had.\n\nThe 2.x port is deliberately separate; this restores a working install now.\nIntegration suite (137 tests) passes.\n\nCo-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(mcp): cap the mcp SDK below 2.0 so a fresh install can start",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T20:26:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8551bca36d1413032c60a4aa9d504cdffd3022cb",
"body": "docs: v0.5.4 release notes (input hardening + code standards)",
"is_bot": false,
"headline": "Merge pull request #223 from d4n-larsson/docs/release-v0.5.4",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T09:30:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "046ec9b9a9ec9820ab2a220bfaa30275939f7c34",
"body": "Covers what landed since v0.5.3: the input-validation hardening from the\nJSON request-path security audit (#220 — token_add namespace validation,\nNaN/Inf rejection, pre-auth log sanitization, defensive decode) and the\nclang-format + clang-tidy code-standards tooling (#221/#222, no runtime\nimpact). No API, wire-protocol, or on-disk format changes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add v0.5.4 release notes (input hardening + code standards)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T09:29:12Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "8876e7816b7115126ca55a55594659d805f13b36",
"body": "chore: enforce canonical mechanical style with clang-tidy",
"is_bot": false,
"headline": "Merge pull request #222 from d4n-larsson/chore/clang-tidy",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T09:26:54Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2b697cfa8141ea5c0705ea3524602d6b009b3d35",
"body": "Second half of the linter work (clang-format is the base branch). Adds\nclang-tidy restricted to the canonical *mechanical* style checks that\nclang-format can't express, applied tree-wide and gated in CI.\n\nChecks (explicit allowlist, all auto-fixable): braces around every\nconditional/loop body, one d\n[…]\ne follow-up: their\nauto-fixer is unsafe and their findings need manual triage. Build clean;\nmake check passes; no behavior change.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: enforce canonical mechanical style with clang-tidy",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T09:25:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8e93bafd646a9adec33f97d76a7c650b62d49591",
"body": "chore: enforce canonical formatting with clang-format",
"is_bot": false,
"headline": "Merge pull request #221 from d4n-larsson/chore/clang-format",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T09:23:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "decc1d4c16cf5b8c35fb0192cbf6adaaa75807ac",
"body": "Adopt clang-format as a hard code-standard gate (docs/conventions.md\npreviously left formatting hand-maintained). Config is LLVM base with the\nproject's 4-space indent, 80-column width, and comment reflow disabled so\nexisting /* */ comments aren't re-wrapped.\n\n- .clang-format: the canonical style.\n-\n[…]\n8, no manual edits). Build clean; make check passes —\nformatting only, no behavior change. A clang-tidy config follows separately.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: enforce canonical formatting with clang-format",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T09:21:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a64e2f84be29c5522d646b876aee417e9afa092d",
"body": "harden untrusted-input handling (parsing-audit findings)",
"is_bot": false,
"headline": "Merge pull request #220 from d4n-larsson/fix/input-hardening",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T08:47:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a2d7a44e90294b3e86705e29b322b1ed3b3165a5",
"body": "From a security audit of the JSON request path. No HIGH issues were found\n(sizes are clamped, record_decode is bounds-checked, cross-tenant reads\nare masked); these close the MED/LOW gaps.\n\n- token_add: validate the namespace before persisting it. It was written\n verbatim into the space/newline-del\n[…]\nagainst size_t overflow in its growth math.\n\nAdds a token_add namespace-injection regression test. Build clean;\nmake check passes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "harden untrusted-input handling (parsing-audit findings)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T08:45:17Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "fcb048de94031e82169fb87b9cc33578480b3e90",
"body": "docs: v0.5.3 test-stability release notes",
"is_bot": false,
"headline": "Merge pull request #219 from d4n-larsson/docs/release-v0.5.3",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T08:11:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "b827499f19e75469e9c7c4d0fcceb5a4a42781d3",
"body": "docs(architecture): drop stale version + complete data-dir layout",
"is_bot": false,
"headline": "Merge pull request #218 from d4n-larsson/docs/architecture-freshen",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T08:10:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9d2ba8723f8dd545150b3ecd07dcc29d6daa6c69",
"body": "A test-only release: no runtime, API, wire-protocol, or on-disk format\nchanges. Carries the CI-stability fix for the timing-flaky\nrecency_factor contract assertion (#217) so the tree tags on a green\nbuild. Notes make clear the binary is functionally identical to v0.5.2.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add v0.5.3 test-stability release notes",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T08:10:00Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "b4b345a73dbcabffac950028625e9010669bccd0",
"body": "- Remove the hardcoded \"(version 0.1.0)\" from the intro; it lagged the\n real version and there's no reason to restate it per release.\n- Add memory.sem (the HNSW graph checkpoint) and snapshots/ (online\n backups) to the data-directory layout, which listed only the log,\n index, and metadata files. Both are already produced by the code and\n referenced elsewhere in the doc.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(architecture): drop stale version + complete the data-dir layout",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T08:07:33Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "09a1a663d1a1154c6ff4da6350ab8f2a1c2d6253",
"body": "test: fix timing-flaky recency_factor contract assertion",
"is_bot": false,
"headline": "Merge pull request #217 from d4n-larsson/fix/flaky-recency-test",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T08:02:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9ed43a1b2a09b142adfd0bcf627d001f717eea51",
"body": "The \"recency_factor < 1 under an aggressive half_life_ms\" check searched\nimmediately after inserting the records. recency = 0.5**(age_ms/half_life_ms)\nis exactly 1.0 when age is 0, so when the insert->search round-trips all\nlanded in the same millisecond (age == 0) the factor was 1.0 and the\nasserti\n[…]\n\nPre-existing flake in qe_search's recency math (#69), not a regression\nfrom the recent concurrency work. make integration passes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "test: fix timing-flaky recency_factor contract assertion",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T08:00:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8cd38cc2b08a264f4059508a4d2e30ceeb464917",
"body": "docs: v0.5.2 concurrency-hardening release notes",
"is_bot": false,
"headline": "Merge pull request #216 from d4n-larsson/docs/release-v0.5.2",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T07:39:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d7e8ef47920dcc2c88e56707d38f46d1de3ddd81",
"body": "Summarizes the fixes-only v0.5.2 release from the concurrency audit\n(PRs #213-#215): two data-loss compaction races (deferred fsync vs log\nswap; unserialized concurrent compaction), the replica connect-timeout\nshutdown fix, the snapshot write-stall, the auth-count race, and the\nrobustness LOWs. No API, wire-protocol, or on-disk format changes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add v0.5.2 concurrency-hardening release notes",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-28T07:38:28Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "fa784fa83fcce1bee6a8d609c15f796e21680001",
"body": "fix: concurrency-review LOW findings",
"is_bot": false,
"headline": "Merge pull request #215 from d4n-larsson/fix/concurrency-lows",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-27T18:19:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "44fb657b16f8fe87a8e33b3cd4a6c1645026a521",
"body": "Four low-severity items from the audit (a fifth — no mid-operation stop\ncheck in compaction/HNSW-build — is deferred; see below).\n\n- replication streamer: stepped the cursor with log_frame_overhead(&db->log),\n reading db->log.encrypted after releasing log_lock — racing a compaction\n swap's memset \n[…]\npaction API — disproportionate here; better as its own change.\n\nBuild clean; make check passes; compaction suite still TSan-clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: address concurrency-review LOW findings",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-27T18:16:10Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "e92a7da68995916f1f4a6d84eb4a7cc2553d8fdd",
"body": "fix: concurrency-review MED findings (auth-count race, connect timeout, snapshot stall)",
"is_bot": false,
"headline": "Merge pull request #214 from d4n-larsson/fix/concurrency-meds",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-27T14:03:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1e99087aafd54b1024241f96c7816640a41d79fe",
"body": "Three medium-severity concurrency issues from the audit:\n\n- query_engine: append_and_hash read config.auth_token_count while\n holding only index_lock, racing runtime token add/revoke which mutate\n it under auth_lock. Read it under auth_lock(read) now. The caller holds\n index_lock(write) and nothi\n[…]\nction swap;\n [0,covered) is an immutable append-only prefix).\n\nBuild clean; make check passes; compaction suite still TSan-clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: address concurrency-review MED findings",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-27T14:01:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "26856b8ab634436e6d77ac5ce3ec7f6e64fed2af",
"body": "fix(compaction): serialize compactions + pin log across deferred fsync",
"is_bot": false,
"headline": "Merge pull request #213 from d4n-larsson/fix/compaction-concurrency",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-27T13:54:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "37a23c751eca14eba4ad8239632c4b64ef17b8df",
"body": "…d fsync\n\nTwo concurrency defects found by an audit of the threaded paths; both are\ndata-loss class and both stem from touching db->log's lifecycle without\nthe log_lock that compaction's swap takes for write. Neither fires on the\nhappy path, so CI's ThreadSanitizer run (contract suite) stayed green.\n[…]\nof log.size in\ntest_compaction_scheduled_trigger. The whole compaction suite is now\nThreadSanitizer-clean; make + make check pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(compaction): serialize compactions and pin the log across deferre…",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-27T13:52:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a15de5510b920404fd3f2b614d9082dfaa221d06",
"body": "docs: v0.5.1 reliability-hardening release notes",
"is_bot": false,
"headline": "Merge pull request #212 from d4n-larsson/docs/release-v0.5.1",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T10:16:53Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "de39b76c61325e9b11689bd2d0fd6cac2d70d624",
"body": "Summarizes the fixes-only v0.5.1 release from the C systems-programming\naudit (PRs #206-#211): write-ahead-log fsync/close error propagation,\ncrash-consistent log swaps, accept() fd-exhaustion backoff, close-on-exec\nacross all fds, and a batch of input-validation/robustness fixes. No API,\nwire-protocol, or on-disk format changes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add v0.5.1 reliability-hardening release notes",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T10:15:18Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e79a2612454af7d35b4f1a828eb22b97d4a0764d",
"body": "fix: low-severity systems-programming hardening batch",
"is_bot": false,
"headline": "Merge pull request #211 from d4n-larsson/fix/low-severity-hardening",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T10:03:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a6aa3ebb95b7382ba61a5773ac102e95a7dfc4b9",
"body": "Seven small robustness fixes from the C systems-programming sweep, none\nindividually severe but each a real defect:\n\n- db_snapshot: check fs_fsync_dir() — a failed directory fsync no longer\n reports the snapshot as durably written (returns DB_SNAPSHOT_ERR).\n- recovery: check log_truncate() and fail\n[…]\n-Werror, no\n-D_GNU_SOURCE); make + make check pass, including the restore contract\ntests that exercise the overwrite-refusal path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: low-severity systems-programming hardening batch",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T10:00:15Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "8153e374317bf55ba82e8dfa0648d77881edda74",
"body": "fix: set O_CLOEXEC/SOCK_CLOEXEC on every fd at creation",
"is_bot": false,
"headline": "Merge pull request #210 from d4n-larsson/fix/fd-cloexec-sweep",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:52:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "38e0cf837faf3ba3f29fdebc485c209add6e93a3",
"body": "The CLOEXEC sweep switched the replication acceptor to accept4(), a\nGNU extension that needs _GNU_SOURCE. The Makefile defines it globally\n(-D_GNU_SOURCE), but the CMake build uses -std=gnu17, which enables\n_DEFAULT_SOURCE but not _GNU_SOURCE, so accept4 was implicitly declared\nand the CI build (wit\n[…]\nVerified: every src/*.c compiles under `-std=gnu17 -Werror` with no\n-D_GNU_SOURCE (mirroring CMake); make + make check still pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(replication): define _GNU_SOURCE for accept4",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:51:01Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b87e476863e6db13f7e0af5b2f8b2a53aeb39831",
"body": "fix(storage): fsync log dir after rename + detect failed reopen",
"is_bot": false,
"headline": "Merge pull request #208 from d4n-larsson/fix/compaction-log-durability",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:37:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "016b5435027062c9924948b4de3cfeca7456f588",
"body": "fix(server): back off on accept() fd exhaustion instead of spinning",
"is_bot": false,
"headline": "Merge pull request #209 from d4n-larsson/fix/accept-emfile-backoff",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:37:17Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "aefccf0af4c862664967d81509d861357ebd588a",
"body": "None of the server's descriptors were opened close-on-exec, so any\nfork()+exec() in this multithreaded process would leak them into the\nchild — including the writable log fd, the O_DIRECTORY fsync fds, and\nthe listening/accepted sockets (which could keep the port held open\nacross a restart). Latent \n[…]\npted socket; convert the\n replication acceptor from accept() to accept4() for the flag\n\nBuild clean; make check passes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix: set O_CLOEXEC/SOCK_CLOEXEC on every fd at creation",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:34:00Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "355a1a5d990d61f666a67059321a56d354b35bae",
"body": "…t 100% CPU\n\nBoth accept loops (the sharded poll() loop threads and the replication\nacceptor) treated only EINTR/EAGAIN specially. On EMFILE/ENFILE (or\nENOBUFS/ENOMEM) accept() returns immediately without draining the\npending connection, so the listener stays level-readable and the loop\nre-polls and\n[…]\ning connections\nbetween naps, turning a CPU meltdown into graceful degradation until an\nfd frees.\n\nBuild clean; make check passes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(server): back off on accept() fd exhaustion instead of spinning a…",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:18:45Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c2a03d192da5d23ce995d479e4a2b3e3e2d39f66",
"body": "…iled reopen\n\nTwo durability gaps in the log-swap paths, found during a C\nsystems-programming sweep:\n\n- compaction and migrate_legacy_log rename() a new log over the live\n one but never fsync the parent directory. rename() is atomic, but\n its durability is not ordered without a directory fsync, so\n[…]\ne database. Now checked and\n logged loudly as an unusable-database / restart-required condition.\n\nBuild clean; make check passes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(storage): fsync the log directory after a rename, and detect a fa…",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:13:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "33c729f8b293e252f6a32eb859fcdba84e65e9e2",
"body": "…client-sigpipe\n\nfix: reject negative size args + ignore SIGPIPE in the CLI",
"is_bot": false,
"headline": "Merge pull request #207 from d4n-larsson/fix/parse-size-negative-and-…",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:09:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "711c21e0f57553375551793c06549950d5c726aa",
"body": "fix(log): surface fsync/close failures instead of dropping them",
"is_bot": false,
"headline": "Merge pull request #206 from d4n-larsson/fix/log-fsync-durability-errors",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:09:24Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d264489b75c65890baf0cd7bf6f6ffa0cad7e6a9",
"body": "…rror\n\nOnly the server ignored SIGPIPE; the client tool did not. If the\nserver reset or half-closed the connection mid-request, the write()\nin net_write_all raised SIGPIPE and terminated the CLI by signal\ninstead of returning -1 and letting the caller print \"send failed\".\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(client): ignore SIGPIPE in the CLI so a server reset is a clean e…",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:06:42Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "115b8deea89462eff9d9bd6b09bc3b7a7eaa11b3",
"body": "…IZE_MAX\n\nparse_size used strtoull, which silently wraps a leading '-' modulo\n2^64 without setting ERANGE, so \"-1\" parsed as SIZE_MAX. A value like\n--embedding-dim -1 or --max-payload -1 was accepted as an enormous\nsize cap (defeating the limit or driving a huge allocation) rather\nthan being rejected. Skip leading whitespace and reject a sign up\nfront, matching parse_int's range checking.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(config): reject negative --*-size values instead of wrapping to S…",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:06:42Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "e3401168693d00232be75841bacde30f4b27d02a",
"body": "log_fsync, log_fsync_if_batched, and log_close returned void and\nignored the fsync()/close() result, so a deferred write-back error\n(EIO from a full volume or failing disk) let an acknowledged write be\nreported durable while never reaching stable storage — silent data\nloss, exactly what the log laye\n[…]\ndurable log over the live one\n- encrypt-migrate aborts if the encrypted scratch log's fsync fails\n\nBuild clean; make check passes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(log): surface fsync/close failures instead of dropping them",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T09:00:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "54c5c2b4acf4e6a5a3549bc92d900b97d2b3bb2c",
"body": "docs: retarget announcement to v0.5.0 (drop -beta suffix)",
"is_bot": false,
"headline": "Merge pull request #205 from d4n-larsson/docs/release-v0.5.0",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T07:16:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6dcbad79cb8d3803a8934ba2fa6e2445c9d2e34e",
"body": "A `-beta.1` SemVer suffix orders 0.5.0-beta.1 *below* 0.4.11, which made the\nolder, less-fixed 0.4.11 look like the \"stable\" choice — backwards, since 0.5.0\ncarries this cycle's durability and correctness fixes. Major version 0.x already\nsignals \"no stability guarantees,\" so the suffix was redundant\n[…]\nd -> docs/release-v0.5.0.md and updates the\ntitle to v0.5.0. The beta-phase framing (intro + \"What beta means here\") is\nunchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: retarget the announcement to v0.5.0 (drop the -beta suffix)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-26T07:13:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "c0c3cf53a257457a051a5146909275fb645e4908",
"body": "docs(readme): fix stale pinned-image example (0.1.0 -> 0.4.11)",
"is_bot": false,
"headline": "Merge pull request #204 from d4n-larsson/docs/readme-pin-version",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T11:08:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e300529973fa01b9fa6013cff0f7227d7d7bbba",
"body": "The quickstart's \"pin a release\" example still referenced :0.1.0, the very first\ntag. Point it at a current stable tag and phrase it as an example (\"e.g. …, see\nReleases\") so it reads as \"how to pin\" rather than \"the current version\" — which\nis how it drifted to :0.1.0 in the first place.\n\nThe :late\n[…]\nrrect: the Docker workflow pushes\n:latest on every merge to main (is_default_branch), so it tracks current code,\nnot an old image.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(readme): fix stale pinned-image example (0.1.0 -> 0.4.11)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T11:05:21Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "afb8daba536905df30c30552d2f26860c79c79d5",
"body": "docs: soften beta announcement wording (\"public beta\", not \"first\")",
"is_bot": false,
"headline": "Merge pull request #203 from d4n-larsson/docs/soften-beta-wording",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T10:34:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d1417f83238ca44e60bb5e716732d83223687d2e",
"body": "The repo already has 19 public 0.x releases, so \"first public beta\" overclaimed.\nReframe as entering public beta after a run of 0.x dev releases — honest about\nthe history while still signaling this is the point where we invite early\nadopters. No other content changes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: soften beta announcement wording (\"public beta\", not \"first\")",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T10:33:36Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "0d7da5782091744c6a1bb23fdd07929575b182e7",
"body": "ci: flag pre-release tags as GitHub pre-releases",
"is_bot": false,
"headline": "Merge pull request #202 from d4n-larsson/ci/prerelease-aware-release",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T10:28:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cc972b9061c7a5751fca30f9faba96169d7e1a2c",
"body": "A v* tag auto-creates a GitHub Release (softprops/action-gh-release), but the\naction defaults prerelease=false and doesn't infer it from the tag name — so a\npre-release tag like v0.5.0-beta.1 would be published as a normal release and\nmarked \"Latest\". Set prerelease from the tag: any tag with a hyph\n[…]\n-release (`:latest` is default-branch-only and the\n:major.minor alias is skipped for pre-releases), so a beta never moves :latest.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "ci: flag pre-release tags as GitHub pre-releases",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T10:26:22Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b4205fbcc7bd98b4aa5b97b486045ccb1f0d67d5",
"body": "docs: v0.5.0-beta.1 release announcement draft",
"is_bot": false,
"headline": "Merge pull request #201 from d4n-larsson/docs/beta-release-announcement",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T10:21:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4e4977d7dc7a42ef4a0ae70611b19c31171ed06f",
"body": "First public beta announcement (GitHub Release body / Show HN base). Leads with\nthe self-hosted positioning, lists the shipped feature set, and is candid about\nwhat \"beta\" means here (single-node, read-replica-only failover, unfrozen\nformats, no production mileage yet). All links verified to resolve, including the\nA/B benchmark pointer to eval/README.md#recorded-result.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: add v0.5.0-beta.1 release announcement draft",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T10:18:27Z",
"body_truncated": false,
"is_coding_agent": true
},
{
"oid": "d8224584be0dd7fbb2d5ba34707a1b5d1875cea6",
"body": "refactor(query): split query_engine.c into subsystem TUs (#189)",
"is_bot": false,
"headline": "Merge pull request #200 from d4n-larsson/refactor/split-query-engine",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T10:09:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f5cd3697f95dad99ced35771b2cbf22d1ebd9c73",
"body": "query_engine.c had grown to ~2680 lines spanning CRUD, search, maintenance,\ngraph, and the whole wire/dispatch layer. Split it into cohesive translation\nunits sharing a small internal header (src/query/qe_internal.h). Pure code\nmovement — no behaviour change.\n\n- query_engine.c (610): core CRUD (inse\n[…]\nBoth build systems glob src/*.c so the new TUs are picked\nup automatically; the internal header is a sibling include.\n\nCloses #189\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(query): split query_engine.c into subsystem TUs (#189)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T10:07:28Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "81855424426103a3329cb47adb85ac5b47d67dfc",
"body": "chore: standards/consistency polish (#191)",
"is_bot": false,
"headline": "Merge pull request #199 from d4n-larsson/chore/standards-polish",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T09:29:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a1031860d006df681ae3d4cfb4ea83c17e82f146",
"body": "Address the consistency findings from the code-quality sweep.\n\n- Crypto test-prototype leak: the three XChaCha20-Poly1305 primitives\n (aegis_chacha20_block / aegis_hchacha20 / aegis_poly1305) were declared by\n hand-copied prototypes in tests/unit/test_aead.c, which could silently drift\n from the \n[…]\nheader/sizing rules — so they are followed, not rediscovered.\n\nBuilds 0-warning under gcc -Werror; make check passes.\n\nCloses #191\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore: standards/consistency polish (#191)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T09:22:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "1574d94544ec7950d8de5c4987182369d578a830",
"body": "refactor(query): dedup the live-id hash scan into collect_ids (#185)",
"is_bot": false,
"headline": "Merge pull request #198 from d4n-larsson/refactor/dedup-id-scan",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T09:12:05Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f98fa4e73ed37575aa65d93fd9878571b2fcd119",
"body": "The \"walk hash->buckets, skip !used/deleted, apply one predicate, grow a\nuint64_t[] of ids\" loop was copied four times (snapshot_live_ids, qe_sweep_\nexpired, qe_consolidate, qe_forget) — and the OOM handling had already drifted\nbetween copies (two break best-effort, two free+return INTERNAL).\n\nRepla\n[…]\nc -Werror; make check passes and an ASan/UBSan contract\nrun is clean (export/sweep/consolidate/forget all exercised).\n\nCloses #185\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(query): dedup the live-id hash scan into collect_ids (#185)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T09:10:32Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "0f5f56cba77d1520aff254676edbdb7acf2b8a64",
"body": "refactor: decompose oversized functions (#188)",
"is_bot": false,
"headline": "Merge pull request #197 from d4n-larsson/refactor/decompose-fns",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T09:03:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "65b8d1bd4c97a9d70a6915c377339b913042b2f4",
"body": "Break up the largest functions into cohesive, testable units. All are pure\nrefactors — behaviour is preserved and verified by the full unit + wire-contract\nsuites (incl. an ASan/UBSan contract run to check the search-path memory\nownership below).\n\n- compaction_run_once (176 -> 144): extract phase 1 \n[…]\nrning under gcc -Werror; make check passes; ASan/UBSan contract run\nis clean (no leaks / double-frees in select_top).\n\nCloses #188\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: decompose oversized functions (#188)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T09:00:51Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "64aad773527c022779452b9a68bdcbacebac8d83",
"body": "refactor(query): single op dispatch table; fix by-op metrics gap (#187)",
"is_bot": false,
"headline": "Merge pull request #196 from d4n-larsson/refactor/qe-dispatch-table",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T08:35:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "911e9051826426fc81c36b71fa68a8d35c4e4603",
"body": "The operation set was enumerated in four disconnected places (dispatch_inner's\nstrcmp chain, is_write_op, metric_op, op_names[]) with nothing keeping them in\nsync. As a result forget/export/purge/consolidate/history were dispatched and\npoliced as real ops but were absent from metric_op/op_names, so \n[…]\nt the five ops advance their own by_op counter and no\nlonger inflate by_op.other. Builds 0-warning under gcc -Werror.\n\nCloses #187\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor(query): single op dispatch table; fix by-op metrics gap (#187)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T08:33:50Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "12670428be6a626a72abde16fe081b5aea872175",
"body": "refactor: extract shared socket I/O into netio (#184)",
"is_bot": false,
"headline": "Merge pull request #195 from d4n-larsson/refactor/shared-netio",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T08:17:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "13b2446f0ce0dccae9edfa6847d0a714e06c3f83",
"body": "The newline-delimited-JSON socket plumbing had 4 independent implementations\nacross the client, replication follower, and health probe. Consolidate on one\nmodule (include/aegisdb/netio.h + src/util/netio.c):\n\n net_dial, net_set_timeouts, net_write_all, net_write_str, net_read_full,\n net_read_line \n[…]\nEOF paths. Builds 0-warning under gcc\n-Werror; make check passes, including the full read-replica log-shipping suite.\n\nCloses #184\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: extract shared socket I/O into netio (#184)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T08:15:59Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "455e2013548ddcd545c7ae92710530bb28fdfc86",
"body": "refactor: consolidate little-endian codec into shared endian.h (#183)",
"is_bot": false,
"headline": "Merge pull request #194 from d4n-larsson/refactor/shared-endian",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T07:50:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4516a39dca870220767a2222eb627d6da1cf7478",
"body": "Little-endian pack/unpack was reimplemented in ~5 places (two byte-identical).\nAdd include/aegisdb/endian.h with header-only aegis_{put,get}_u{16,32,64}le and\nroute every site through it:\n\n- log.c / ckpt_crypt.c: drop the duplicated (byte-identical) put_u32le/get_u32le.\n- replication.c: drop the loc\n[…]\nng\nunder gcc -Werror; make check (unit + wire contract, incl. recovery / snapshot /\nrestore / hnsw save-load) passes.\n\nCloses #183\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "refactor: consolidate little-endian codec into shared endian.h (#183)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-25T07:48:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "26dbe9ba271eb9c6ae59802ad10eae9508c97971",
"body": "feat(storage): fs_write_atomic + fix restore/token fsync durability gaps (#182)",
"is_bot": false,
"headline": "Merge pull request #193 from d4n-larsson/feat/fs-write-atomic",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-24T21:29:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "30b2a360b221059c60c63c7daff95f72c9afa330",
"body": "… (#182)\n\nThe \"write tmp -> fsync -> rename -> fsync parent dir\" recipe was reimplemented\n~5x with drifting durability, and two copies were missing fsyncs. Consolidate on\none correct helper and close the gaps.\n\n- Add fs_write_atomic(path, buf, len, mode) and fs_copy_file(src, dst) to\n fsutil. Both \n[…]\nissing-source). Builds 0-warning under\ngcc -Werror; make check (unit + wire contract, incl. snapshot/restore) passes.\n\nCloses #182\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(storage): extract fs_write_atomic + fix restore/token fsync gaps…",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-24T21:26:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "720b11140fa42b22772803acbb1e24dcb924fa34",
"body": "chore(c): build hygiene + buffer/dup cleanups (#181, #190)",
"is_bot": false,
"headline": "Merge pull request #192 from d4n-larsson/chore/quality-quick-wins",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-24T21:13:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7c93c8a760621f82bb99a682dde521d00af72b1d",
"body": "#181 — build hygiene:\n- Add a WERROR toggle (off by default; CI runs `make check WERROR=1`) so the\n tree stays warning-clean under -Wall -Wextra without booby-trapping\n downstream builds on newer compilers that may add warnings.\n- Drop the now-redundant -Wno-unused-parameter everywhere (Makefile, \n[…]\n checkpoint comment in hash_index.c (v4/30-byte).\n\nBuilds 0-warning under gcc -Werror; `make check` (unit + wire contract) passes.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "chore(c): build hygiene + buffer/dup cleanups (#181, #190)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-24T21:11:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "15732f64a22c22cddd5f28cfc802094496ef9aa9",
"body": "docs: surface the memory-inspector screenshot",
"is_bot": false,
"headline": "Merge pull request #179 from d4n-larsson/docs/inspector-screenshot",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-24T20:18:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a596ba486ea3430da2962c5891f4cabea430ab1f",
"body": "A screenshot now exists at docs/img/inspector.png. Wire it in:\n- site: replace the TODO in the \"control\" record with a bordered <figure>\n showing the inspector (served from site/inspector.png — the Pages root is\n site/, so the image must live there; width/height set to avoid layout shift).\n- tools\n[…]\ner at docs/img/inspector.png\n (was a broken ../../docs/img link).\n\nSite tags balance (12 sections, 94 divs, 1 figure); docs-only.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs: surface the memory-inspector screenshot (site + inspector README)",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-24T20:15:34Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a881f1c970365a6ead7ec927c0788527437b11a3",
"body": "feat(integration): wire LLM extraction into aegisdb-init + the setup skill",
"is_bot": false,
"headline": "Merge pull request #178 from d4n-larsson/feat/init-extract-mode",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-24T10:47:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "a73d6e0663b2e46d5b324e2081977646e8c03f4f",
"body": "…skill\n\nThe capture-quality feature from 2.1 (extract_mode + contradiction→supersession)\nexisted in code but wasn't reachable through setup: aegisdb-init had no flag and\nthe capture hook (which doesn't inherit the MCP server's env) never got it.\n\n- aegisdb-init: `--extract-mode` (none|claude-code|an\n[…]\nasserting the prefixed hook + that extraction stays off the MCP env.\n Full suite passes (97 unit + 13 contract + 27 integration).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(integration): wire LLM extraction into aegisdb-init + the setup …",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-24T10:46:35Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "34627576685ee94ea6edcf2392aefb6a596396cd",
"body": "docs(site): add a \"proof\" record — it actually works, and you can measure it",
"is_bot": false,
"headline": "Merge pull request #177 from d4n-larsson/docs/site-eval-proof",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-24T10:34:38Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "85dbbe6084f07bb38275688df6780c22f79ea04e",
"body": "…sure it\n\nThe site sold features and speed but never showed the memory changes agent\noutcomes. Add a \"Does the memory actually work? Measure it.\" record (seq=0008),\nin the same twoup + results-block style as the perf record:\n\n- Controlled A/B: teach a fact, then answer in a fresh session with memory\n[…]\n CSS), renumbers trailing records to 0009-0012,\nadds a \"proof\" nav link. Verified: seq 0001-0012 clean; sections/divs/pre balance.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(site): add a \"proof\" record — it actually works, and you can mea…",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-24T10:33:29Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b0f36a8ee15e81e17035b44c348531b442a385ec",
"body": "feat(eval): sandbox the A/B answer model + fix the judge; record +100% (clean)",
"is_bot": false,
"headline": "Merge pull request #176 from d4n-larsson/feat/ab-sandbox",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T20:08:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4a6f1387b87b9217ffcede257061c02483519f8f",
"body": "…% (clean)\n\nRunning the benchmark with a real model surfaced two ways the OFF (no-memory) arm\ncan cheat, both now closed — and the clean number is +100%.\n\n- --sandbox: the claude-code backend runs `claude -p` from an empty dir with\n tools disabled (--disallowedTools), so OFF has no filesystem/repo/\n[…]\n ON 100% / OFF 0% /\nlift +100% — memory is the entire difference. eval/README documents the number\nand both side-channel pitfalls.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(eval): sandbox the A/B answer model + fix the judge; record +100…",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T20:06:36Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "4a963d870dad85eb5a5db42fae147b46fb294662",
"body": "feat(eval): A/B task benchmark — does memory lift task success?",
"is_bot": false,
"headline": "Merge pull request #175 from d4n-larsson/feat/ab-task-benchmark",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T17:56:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6fcbcd0b8d5489695b6987afd4d8fc3b0aa63e36",
"body": "Real-model run (`--model claude-code`, 10 tasks): ON 100% / OFF 20% / lift +80%.\nDocument it, and add the important caveat: the claude-code backend runs `claude -p`\nin the repo with tool access, so OFF can read the codebase and \"pass\" tasks whose\nfictional fact coincides with real code (here: tests,\n[…]\n use an API backend with no filesystem/tools (or the\nfake model, which has no side channel), and prefer facts absent from the env.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(eval): record the A/B result (+80%) and the OFF-side-channel caveat",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T17:55:13Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "35ae4259cf15fdba908edb9580578685f884e4e8",
"body": "`make eval` measures retrieval (did the right memory rank?); this measures\noutcomes. Each task teaches a fact in one \"session\" (stored in AegisDB), then\nanswers a question in a fresh session two ways — ON (recall + inject) vs OFF (no\nmemory) — and reports each success rate and the LIFT (ON − OFF). T\n[…]\nodel: ON 100% / OFF 0% / lift +100%; --min-lift gate and\n--json work. Reuses recall_eval.Server + embedders (no new server infra).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(eval): A/B task benchmark — does memory lift task success?",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T17:31:08Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "ba39f060827dd8a52381a19c6561591c8c04ff46",
"body": "docs(readme): surface memory-quality, temporal, and compliance features",
"is_bot": false,
"headline": "Merge pull request #173 from d4n-larsson/docs/readme-capabilities",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T16:06:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cac77d1ad3edc1d68b25154588e0fdb7b3116e6d",
"body": "docs(site): add curation + control records for the new capabilities",
"is_bot": false,
"headline": "Merge pull request #174 from d4n-larsson/docs/site-capabilities",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T16:06:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "75014107c1569f3048d12e4df18eeba44b377859",
"body": "…ties\n\nThe landing site's log-sheet sold memory types, perf, the wire protocol, and\nClaude Code — but nothing about the memory-quality layer or the control/\ncompliance features shipped this session. Add two records in the existing ledger\nstyle, after the memory-model record:\n\n- seq=0005 \"Memory that\n[…]\n, and adds a \"curation\" nav link. Left a TODO marker where a\nmemory-inspector screenshot (docs/img/inspector.png) can be surfaced.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(site): add \"curation\" and \"control\" records for the new capabili…",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T16:05:16Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "77c5a615ced805fbc145bce6a9d0e0d72bc27533",
"body": "…atures\n\nThe Features list predated this session's work. Add bullets for what shipped:\n- Explainable ranking (search `explain:true` — similarity × weight × recency)\n- Memory that curates itself (`consolidate` dedup + `supersedes` provenance;\n `forget` importance×recency decay; both measurable via `\n[…]\nthe memory-quality counters in the Observability bullet.\n\nDocs-only; the ops table + wire-protocol reference already listed these.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "docs(readme): surface the memory-quality, temporal, and compliance fe…",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T15:40:58Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "b168d35bfadccf417a7113b6cdd6cded64b34a49",
"body": "fix(capture): skip code / tool-output so it isn't stored as memory",
"is_bot": false,
"headline": "Merge pull request #172 from d4n-larsson/fix/capture-skip-code",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T15:14:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8b3be2eef33a75c88edf6183b1bc1902a4bde726",
"body": "feat(design): unified AegisDB visual identity across surfaces",
"is_bot": false,
"headline": "Merge pull request #171 from d4n-larsson/feat/unified-identity",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T15:14:33Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5c6a0f15008de647a2bb93bf90753d42b1578033",
"body": "Reported: the memory inspector showed junk memories like\n`46\\tcontent: \"\"; position: fixed; inset: 0; z-index: 0;` — raw source lines\nfrom the session transcript.\n\nCause: the salience markers match as SUBSTRINGS, so code/tool-output scored\n\"salient\" and was captured — `position: fixed` hits the \"fix\n[…]\ner substring while\nkeeping the real decision beside them). Full integration suite passes\n(93 unit + 13 contract + 27 integration).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(capture): skip code / tool-output so it isn't stored as memory",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T15:13:09Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "591569a0cba7e5f613598d7bdf1a62e913dc2e7b",
"body": "`docker compose up` starts the server but not the memory inspector, so the UI\nhad nothing to connect to (\"Not connected to the AegisDB bridge\"). The inspector\nis a bridge process, not a static page, so it needs its own service.\n\nAdd an `inspector` profile (like `metrics`/`monitoring`): a stdlib-Pyth\n[…]\naegisdb container, /api/query stats returns live data.\nInspector README documents both the compose profile and the make/host path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(compose): add an opt-in `inspector` profile",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T14:38:06Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "579655d8af013739d3db3965b7c0e3577e354587",
"body": "Reported: \"JSON.parse: unexpected character at line 1 column 1\" in the browser.\nCause: the inspector was opened outside the bridge (a file:// URL or an IDE\npreview), so /api/config returned non-JSON (or the fetch failed) and the raw\n.json()/JSON.parse threw an uncaught exception, leaving a broken pa\n[…]\ng load, rendering a clear \"run `make inspector` and open\n http://127.0.0.1:8600/\" message (styled, since the tokens are inlined).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(inspector): fail gracefully when not opened through the bridge",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T14:32:23Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "61601bee3c511b3876d747c1d885f92179e4195a",
"body": "Reported: the memory browser showed as plain white/black. Cause: the reskin\nlinked the shared identity as `/aegis.css`, an absolute path only served by the\nbridge — so opening the page any other way (from the filesystem, an IDE preview)\n404'd the stylesheet and every `var(--…)` fell back to nothing \n[…]\nly diverge.\n\ntest_bridge.py: identity drift guard + assert the page inlines the tokens\n(instead of linking them). All checks pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "fix(inspector): inline identity tokens so it renders standalone",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T12:35:48Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "a046c04c13ec55c644b763156dab816d204abb20",
"body": "Three surfaces had drifted apart — the landing site (a polished ink/brass/paper\n\"ledger\" look), the memory inspector (generic blue, system fonts), and the\nGrafana dashboard. This establishes one shared identity and applies it.\n\n- site/aegis.css: the single source of truth — design tokens (ink/brass/\n[…]\n\nJSON valid. Deeper Grafana theming (fonts/bg) needs a full Grafana theme — left\nas a follow-up, along with a screenshot for docs.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
"is_bot": false,
"headline": "feat(design): unified AegisDB visual identity across surfaces",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T12:20:57Z",
"body_truncated": true,
"is_coding_agent": true
},
{
"oid": "384ecee06b542cb3c34e5b0b6ffb85567fada39a",
"body": "feat(metrics): observability for the memory-quality layer (ROADMAP 3.3)",
"is_bot": false,
"headline": "Merge pull request #170 from d4n-larsson/feat/memory-quality-metrics",
"author_name": "Dan Larsson",
"author_login": "d4n-larsson",
"committed_at": "2026-07-23T12:01:06Z",
"body_truncated": false,
"is_coding_agent": false
}
],
"releases_count": 26,
"commits_last_year": 360,
"latest_release_at": "2026-07-28T20:36:30Z",
"latest_release_tag": "v0.5.5",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 5,
"days_since_latest_release": 0,
"mean_days_between_releases": 0.7
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "aegisdb-mcp",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "pypi",
"matches_repo": true,
"registry_url": "https://pypi.org/project/aegisdb-mcp/",
"is_deprecated": false,
"latest_version": "0.5.6",
"repository_url": "https://github.com/d4n-larsson/aegisdb",
"versions_count": 24,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": 2234,
"first_published_at": "2026-06-28T18:48:37.149856Z",
"latest_published_at": "2026-07-28T21:25:54.802963Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 0,
"stars": 6,
"watchers": 0,
"fork_history": {
"days": [],
"complete": true,
"collected": 0,
"total_forks": 0
},
"star_history": null,
"open_issues_and_prs": 1
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [
"examples"
],
"has_llms_txt": false,
"has_dockerfile": true,
"has_mcp_signal": true,
"bootstrap_files": [
"Makefile",
"integrations/claude-code/Makefile"
],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [],
"largest_source_bytes": 88232,
"source_files_sampled": 147,
"oversized_source_files": 1,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 1096
},
"dependencies": {
"manifests": [],
"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": [],
"dependencies": [
{
"name": "mcp",
"manifest": "integrations/claude-code/pyproject.toml",
"ecosystem": "pypi",
"version_constraint": ">=1.0,<3"
}
],
"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": 180,
"open_issues": 1,
"closed_ratio": 0.979,
"closed_issues": 46,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "d4n-larsson",
"commits": 387,
"avatar_url": "https://avatars.githubusercontent.com/u/161018631?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"ci.yml",
"docker.yml",
"first-contact.yml",
"pages.yml",
"pypi.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [],
"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": 6,
"reason": "9 out of 15 merged PRs checked by a CI test -- score normalized to 6",
"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/15 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 10,
"reason": "project is fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 10,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": 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": "SAST tool is not run on all commits -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": null,
"reason": "no releases found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 10,
"reason": "0 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "f3ddf1f9ee341ee478824a71e06478bd2b879b37",
"ran_at": "2026-07-28T21:27:47Z",
"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-28T21:25:58Z",
"oldest_open_prs": [],
"last_merged_pr_at": "2026-07-28T21:23:52Z",
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": [
{
"number": 186,
"created_at": "2026-07-24T20:41:03Z",
"last_comment_at": null,
"last_comment_author": null
}
]
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/d4n-larsson/aegisdb",
"host": "github.com",
"name": "aegisdb",
"owner": "d4n-larsson"
},
"metrics": {
"overall": {
"key": "overall",
"band": "moderate",
"name": "Overall health",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"security": 41,
"vitality": 75,
"community": 36,
"governance": 52,
"engineering": 72
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 75,
"weight": 0.22,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 58,
"inputs": {
"commits_last_year": 360,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 5
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"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": "360 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 360
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_signed_releases"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 100,
"inputs": {
"releases_count": 26,
"latest_release_tag": "v0.5.5",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 0.7
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "26 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 26
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~0.7 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 0.7
}
}
],
"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": 36,
"weight": 0.18,
"metrics": [
{
"key": "popularity",
"band": "critical",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 11,
"inputs": {
"forks": 0,
"stars": 6,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "6 stars",
"points": 11.3,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 6
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "0 forks",
"points": 0,
"status": "missed",
"details": [
{
"code": "forks",
"params": {
"count": 0
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "moderate",
"name": "Community health",
"note": null,
"notes": [],
"value": 50,
"inputs": {
"has_readme": true,
"has_license": true,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "recognized license (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": "moderate",
"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": 56,
"inputs": {
"packages": [
"aegisdb-mcp"
],
"dependents": null,
"ecosystems": "pypi",
"total_downloads": null,
"monthly_downloads": 2234
},
"components": [
{
"key": "monthly_downloads",
"name": "Monthly downloads",
"detail": "2,234 downloads/month across pypi",
"points": 44.7,
"status": "partial",
"details": [
{
"code": "downloads_monthly",
"params": {
"count": 2234,
"ecosystems": "pypi"
}
}
],
"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": "moderate",
"name": "Sustainability & Governance",
"value": 52,
"weight": 0.24,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"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 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "good",
"name": "Issue & PR responsiveness",
"note": null,
"notes": [],
"value": 84,
"inputs": {
"merged_prs": 180,
"open_issues": 1,
"closed_issues": 46,
"issue_closed_ratio": 0.979,
"closed_unmerged_prs": 0
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "98% of issues closed",
"points": 45.8,
"status": "partial",
"details": [
{
"code": "issues_closed_share",
"params": {
"share": 98
}
}
],
"max_points": 46.75
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "180/180 decided PRs merged",
"points": 38.2,
"status": "met",
"details": [
{
"code": "decided_prs_merged",
"params": {
"merged": 180,
"decided": 180
}
}
],
"max_points": 38.25
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/15 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": 27,
"inputs": {
"followers": 3,
"owner_type": "User",
"is_verified": null,
"owner_login": "d4n-larsson",
"public_repos": 1,
"account_age_days": 886
},
"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": "3 followers of d4n-larsson",
"points": 4.3,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 3,
"login": "d4n-larsson"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "1 public repos, account ~2 yr old",
"points": 7,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 1
}
},
{
"code": "account_age_years",
"params": {
"years": 2
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "excellent",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"aegisdb-mcp"
],
"ecosystems": "pypi",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on pypi",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "pypi"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "24 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 24
}
}
],
"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": "good",
"name": "Engineering Quality",
"value": 72,
"weight": 0.2,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": null,
"notes": [],
"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": "5 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 5
}
}
],
"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": "9 out of 15 merged PRs checked by a CI test -- score normalized to 6",
"points": 12,
"status": "partial",
"details": [],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "excellent",
"name": "Documentation",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"topics": [
"agent-memory",
"ai-agents",
"c",
"claude",
"claude-code",
"database",
"docker",
"embeddings",
"llm",
"mcp",
"memory",
"semantic-search",
"tcp",
"vector-search"
],
"has_wiki": false,
"homepage": "https://d4n-larsson.github.io/aegisdb/",
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": "https://d4n-larsson.github.io/aegisdb/",
"points": 15,
"status": "met",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "14 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 14
}
}
],
"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): Signed-Releases. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"signed_releases"
]
}
},
{
"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": "9 out of 15 merged PRs checked by a CI test -- score normalized to 6",
"points": 1.5,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/15 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is fuzzed",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.5,
"status": "met",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow 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": "SAST tool is not run on all commits -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "no releases found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "0 existing vulnerabilities detected",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "excellent",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"review_only_matches": 0,
"assessed_self_published_locations": 2
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 78,
"weight": 0,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"CLAUDE.md"
],
"agent_instruction_max_bytes": 1096
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "CLAUDE.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "CLAUDE.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "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": "good",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 71,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [],
"has_dockerfile": true,
"typed_language": true,
"bootstrap_files": [
"Makefile",
"integrations/claude-code/Makefile"
],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0.53,
"toolchain_manifests": [],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "Makefile, integrations/claude-code/Makefile",
"points": 18,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Makefile, integrations/claude-code/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": "C (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "Dockerfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "Dockerfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "53 of the last 100 commits agent-authored or agent-credited",
"points": 10,
"status": "met",
"details": [
{
"code": "agent_authored_commits",
"params": {
"count": 53,
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "excellent",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "C",
"largest_source_bytes": 88232,
"source_files_sampled": 147,
"oversized_source_files": 1
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "C (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "C"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "1/147 source files over 60KB",
"points": 54.6,
"status": "partial",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 147,
"oversized": 1
}
}
],
"max_points": 55
}
]
},
{
"key": "ai_interfaces",
"band": "moderate",
"name": "Machine-readable interfaces",
"note": null,
"notes": [],
"value": 60,
"inputs": {
"example_dirs": [
"examples"
],
"has_mcp_signal": true,
"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": 20,
"status": "met",
"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",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"deps.dev does not index pypi:aegisdb-mcp@0.5.6; advisories assessed against the repository dependency graph instead"
],
"report_type": "repository",
"generated_at": "2026-07-28T21:28:04.591078Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/d/d4n-larsson/aegisdb.svg",
"full_name": "d4n-larsson/aegisdb",
"license_state": "standard",
"license_spdx": "MIT"
}