Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-28 21:28 UTC

d4n-larsson / aegisdb

A fast, single-binary C database that gives AI agents durable, searchable long-term memory — with a Claude Code integration.

C · PythonMIT★ 6 estrellas⑂ 0 forksdesde jun 2026Ver en GitHub ↗

d4n-larsson/aegisdb tiene un índice de salud de 56 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es AI Readiness (78/100) y la más baja, Community & Adoption (36/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

56
global / 100
Moderado

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

56
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

Dan LarssonCuenta personal
3 seguidores1 repositorio públicodesde feb 2024LTG Display

Este repositorio pertenece a una cuenta personal. Un proyecto con un único propietario conlleva más riesgo de continuidad que uno respaldado por una organización.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicación
PyPIaegisdb-mcp0.5.6223424hace 0 días

Métricas por categoría

Vitalidad

¿Está vivo el proyecto: se escribe código y se publican versiones?

75Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
3.5/36Cadencia de commits — 5/52 semanas con commits
18/18Volumen de commits — 360 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year360
human_commit_share1
days_since_last_push0
active_weeks_last_year5
Cómo se puntúa
27/27Publica versiones — 26 versiones publicadas
36/36Recencia de las versiones — última versión hace 0 días
27/27Cadencia de publicación — una versión cada ~0,7 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count26
latest_release_tagv0.5.5
releases_from_tagsno
days_since_latest_release0
mean_days_between_releases0,7
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

36En riesgo · 18% del índice global
Cómo se puntúa
11.3/60Estrellas — 6 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars6
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
44.7/80Descargas mensuales — 2234 descargas/mes en pypi
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packagesaegisdb-mcp
dependents
ecosystemspypi
total_downloads
monthly_downloads2234
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

¿Sobrevivirá el proyecto a sus personas: factor bus, capacidad de respuesta, quién lo respalda y mantenimiento del paquete?

52Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0/22.5Distribución de commits — el principal contribuyente firma el 100% de los commits
1.4/13.5Amplitud de contribuyentes — 1 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled1
top_contributor_share1
Cómo se puntúa
45.8/46.8Resolución de issues — 98% de issues cerradas
38.2/38.3Aceptación de PR — 180/180 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/15 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs180
open_issues1
closed_issues46
issue_closed_ratio0,979
closed_unmerged_prs0
Cómo se puntúa
10/30Respaldo de la propiedad — cuenta personal (usuario)
0/20Dominio verificado — no aplicable a cuentas de usuario
4.3/25Alcance del propietario — 3 seguidores de d4n-larsson
7/25Trayectoria — 1 repos públicos, cuenta de ~2 años
Datos de entrada utilizados
followers3
owner_typeUser
is_verified
owner_logind4n-larsson
public_repos1
account_age_days886
Excluidos de la puntuación (sin datos o no aplicable): Dominio verificado. Los pesos restantes se han renormalizado.
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en pypi
35/35Recencia de publicación — última publicación hace 0 días
20/20Historial de versiones — 24 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packagesaegisdb-mcp
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

¿Existen unas prácticas mínimas de ingeniería y documentación?

72Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 5 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
12/20OpenSSF Scorecard: CI-Tests — 9 out of 15 merged PRs checked by a CI test -- score normalized to 6
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

90Excelente
Cómo se puntúa
30/30README
25/25Directorio de documentación
15/15Sitio de documentación / página del proyecto — https://d4n-larsson.github.io/aegisdb/
10/10Descripción del repositorio
10/10Topics — 14 topics
0/10Wiki
Datos de entrada utilizados
topicsagent-memory, ai-agents, c, claude, claude-code, database, docker, embeddings, llm, mcp, memory, semantic-search, tcp, vector-search
has_wikino
homepagehttps://d4n-larsson.github.io/aegisdb/
has_readme
has_docs_dir
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

41En riesgo · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
1.5/2.5CI-Tests — 9 out of 15 merged PRs checked by a CI test -- score normalized to 6
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/15 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
10/10Dangerous-Workflow — no dangerous workflow patterns detected
0/7.5Dependency-Update-Tool — no update tool detected
5/5Fuzzing — project is fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
5/5Packaging — packaging workflow detected
0/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,1
Excluidos de la puntuación (sin datos o no aplicable): signed_releases. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

78Bueno · 0% del índice global
Cómo se puntúa
45/45Instrucciones para agentes — CLAUDE.md
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 100 de 100 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share1
agent_instruction_filesCLAUDE.md
agent_instruction_max_bytes1096
Cómo se puntúa
18/18Arranque con un solo comando — Makefile, integrations/claude-code/Makefile
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — C (tipado estático)
10/10Entorno reproducible — Dockerfile
10/10Práctica demostrada con agentes — 53 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 0
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfile
typed_language
bootstrap_filesMakefile, integrations/claude-code/Makefile
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,53
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
45/45Código verificable por tipos — C (tipado estático)
54.6/55Tamaños de archivo manejables — 1/147 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageC
largest_source_bytes88.232
source_files_sampled147
oversized_source_files1
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
20/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signal
api_schema_files

Datos clave

6estrellas de GitHub
1contribuidores
360commits en los últimos 12 meses
0días desde el último push
26versiones publicadas
1factor bus
1issues abiertas
ecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

OpenSSF Scorecard 4.1 / 10
4.1agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-28 21:27 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
6CI-Tests9 out of 15 merged PRs checked by a CI test -- score normalized to 6
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/15 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
10Fuzzingproject is fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
0Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 0
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 1
RegistroPaqueteRestricción de versiónManifiesto
PyPImcp>=1.0,<3integrations/claude-code/pyproject.toml
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasPyPI.