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

KumihoIO / kumiho-memory

Universal memory provider for AI agents (Redis + Kumiho)

PythonMIT★ 0 estrellas⑂ 0 forksdesde jul 2026Ver en GitHub ↗

KumihoIO/kumiho-memory tiene un índice de salud de 52 sobre 100, lo que lo sitúa en la banda Moderado. Su puntuación más alta es Engineering Quality (71/100) y la más baja, Community & Adoption (24/100). Se actualizó por última vez hoy. Una sola persona concentra la mayor parte del trabajo reciente.

52
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.

52
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

Kumiho.ioOrganización
6 seguidores16 repositorios públicosdesde mar 2026

Este repositorio está respaldado por una organización: una custodia compartida y responsable que puede sobrevivir a cualquier mantenedor individual.

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
PyPIkumiho-memory1.1.0-65hace 0 díaskumihomemoryai-agentsrediscognitive-memorysummarizationconversational-aimcp

Métricas por categoría

Vitalidad

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

70Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 0 días
6.2/36Cadencia de commits — 9/52 semanas con commits
18/18Volumen de commits — 171 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_year171
human_commit_share1
days_since_last_push0
active_weeks_last_year9
Cómo se puntúa
27/27Publica versiones — 1 versiones publicadas
36/36Recencia de las versiones — última versión hace 7 días
12.6/27Cadencia de publicación — cadencia desconocida (una sola versión)
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count1
latest_release_tagv1.0.0
releases_from_tagsno
days_since_latest_release7
mean_days_between_releases
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?

24Crítico · 18% del índice global
Cómo se puntúa
0/60Estrellas — 0 estrellas
0/25Forks — 0 forks
0/15Observadores — 0 observadores
Datos de entrada utilizados
forks0
stars0
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

Sostenibilidad y Gobernanza

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

46En riesgo · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
0.1/22.5Distribución de commits — el principal contribuyente firma el 99% de los commits
2.7/13.5Amplitud de contribuyentes — 2 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled2
top_contributor_share0,994
Cómo se puntúa
0/46.8Resolución de issues — 0% de issues cerradas
38.2/38.3Aceptación de PR — 1/1 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/28 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs1
open_issues2
closed_issues0
issue_closed_ratio0
closed_unmerged_prs0
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
6.1/25Alcance del propietario — 6 seguidores de KumihoIO
9.8/25Trayectoria — 16 repos públicos, cuenta de ~0 años
Datos de entrada utilizados
followers6
owner_typeOrganization
is_verified
owner_loginKumihoIO
public_repos16
account_age_days148
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 — 65 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packageskumiho-memory
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Calidad de Ingeniería

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

71Bueno · 20% del índice global
Cómo se puntúa
24/24Flujos de trabajo de CI — 2 flujo(s) de trabajo
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-commit
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 1 out of 1 merged PRs checked by a CI test -- score normalized to 10
Datos de entrada utilizados
has_ci
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno
Cómo se puntúa
30/30README
25/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
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?

45En 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
2.5/2.5CI-Tests — 1 out of 1 merged PRs checked by a CI test -- score normalized to 10
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/28 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
0/5Fuzzing — project is not 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.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
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
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4,5
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.

38En riesgo · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
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_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
0/11Verificación estática de tipos
0/10Entorno reproducible
10/10Práctica demostrada con agentes — 91 de los últimos 100 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Datos de entrada utilizados
has_nixno
has_tests
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0,91
toolchain_manifests
dependency_bot_commit_share0
Cómo se puntúa
0/45Código verificable por tipos — Python sin configuración de verificación de tipos
48.7/55Tamaños de archivo manejables — 10/87 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languagePython
largest_source_bytes159.367
source_files_sampled87
oversized_source_files10

Datos clave

0estrellas de GitHub
2contribuidores
171commits en los últimos 12 meses
0días desde el último push
1versiones publicadas
1factor bus
2issues abiertas
PyPIecosistemas de paquetes

Advertencias de recopilación de datos

  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index pypi:kumiho-memory@1.1.0; advisories assessed against the repository dependency graph instead

Más detalle

OpenSSF Scorecard 4.5 / 10
4.5agregado

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-30 01:18 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests1 out of 1 merged PRs checked by a CI test -- score normalized to 10
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/28 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
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
10Packagingpackaging workflow detected
1Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 1
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
10Vulnerabilities0 existing vulnerabilities detected
Dependencias directas 3
RegistroPaqueteRestricción de versiónManifiesto
PyPIkumiho>=0.10.7pyproject.toml
PyPIredis>=5.0.0pyproject.toml
PyPIrequests>=2.31.0pyproject.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": [],
      "is_fork": false,
      "size_kb": 882,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "Python": 2059496
      },
      "pushed_at": "2026-07-30T01:11:01Z",
      "created_at": "2026-07-22T02:32:54Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-30T01:10:40Z",
      "description": "Universal memory provider for AI agents (Redis + Kumiho)",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "Python",
      "significant_languages": [
        "Python"
      ]
    },
    "owner": {
      "blog": "https://kumiho.io",
      "name": "Kumiho.io",
      "type": "Organization",
      "login": "KumihoIO",
      "company": null,
      "location": "United States of America",
      "followers": 6,
      "avatar_url": "https://avatars.githubusercontent.com/u/265208441?v=4",
      "created_at": "2026-03-03T07:03:05Z",
      "is_verified": null,
      "public_repos": 16,
      "account_age_days": 148
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-07-22T03:04:57Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "17f2efb7a4fdf7c5d18a384adb6de8193270f1d1",
          "body": "…port\n\nfix(mcp): reflect's capture vocabulary reaches the caller",
          "is_bot": false,
          "headline": "Merge pull request #2 from KumihoIO/fix/reflect-schema-survives-trans…",
          "author_name": "KaveOne | Kumiho",
          "author_login": "kaveone",
          "committed_at": "2026-07-30T01:10:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b0a86eece2e87e804ffce6236206479988412dec",
          "body": "Adversarial review (4 lenses, 7 findings, 0 surviving refutation) did not\nfind a defect in the fix, but two of the refutations were right about\nsomething else, and both are addressed here.\n\n1. The documented transport rule was over-stated. The first commit said\n   the `required` arrays \"top-level an\n[…]\n list at all. Verified directly.\n\nVersion 1.1.0: a newly enforced constraint plus newly advertised\nvocabulary. Patch would understate it.\n\nSuite: 1020 passed, same 6 pre-existing failures as baseline.",
          "is_bot": false,
          "headline": "fix(mcp): correct the transport claim, pin the gate, release 1.1.0",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-30T01:08:12Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "1f70932b3bab565d06a7fdf4950552eb075dfeca",
          "body": "A caller reading `kumiho_memory_reflect`'s schema could not see which\nmemory types a capture may carry, so it picked one by guesswork. Measured\nagainst a live host: property `description` text is forwarded ONLY for\nREQUIRED top-level properties, and the `required` arrays themselves —\ntop-level and n\n[…]\nd: 1019 passed, same 6 pre-existing failures as baseline\n(test_summarization provider defaults, test_dream_state, memory_manager\nretriever) plus test_skill_ingest's pre-existing collection IndexError.",
          "is_bot": false,
          "headline": "fix(mcp): reflect's capture vocabulary reaches the caller",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-30T00:10:29Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "0daf613edc9a97d1a3f6ea556229421609135470",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): attribute the paper citation to Kumiho Inc.",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-22T02:57:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b247e09bffe04f738fced0701f382aca48697a8a",
          "body": "Add a Research/citation section (with BibTeX) and a top-of-README paper\nlink for Young Bin Park, 'Graph-Native Cognitive Memory for AI Agents:\nFormal Belief Revision Semantics for Versioned Memory Architectures'\n(arXiv:2603.17244, 2026) — the formal grounding for this package's\nconsolidation and belief-revision behavior.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(readme): cite the foundational paper (arXiv:2603.17244)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-22T02:55:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "52dee21be413c3a888d8c7ff1038131760c0c110",
          "body": "Bump every version surface to 1.0.0 and graduate to Production/Stable:\n- pyproject.toml: version 0.20.0 -> 1.0.0; classifier Alpha -> Production/Stable\n- kumiho_memory/__init__.py: __version__ -> 1.0.0\n- README status block: Beta (0.20.x) -> Stable (1.0.x), semver commitment\n- RELEASE_NOTES: v1.0.0 \n[…]\n  (#138/#139 pre-LLM redaction, #136 cross-project decompose, #135 dedup\n  asymmetry guard, #143 decisions surface rename with legacy fallback)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: 1.0.0 — first stable release from the standalone repo",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-22T02:49:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "286a59638a4be2c517c502421c99a3ad45f947ce",
          "body": "…RLs)\n\nExtracted from KumihoIO/kumiho-SDKs (python/kumiho-memory) with history\npreserved via git subtree split.\n\n- pyproject [project.urls] now point at KumihoIO/kumiho-memory\n- .github/workflows/publish.yml: PyPI Trusted Publishing (OIDC), tag v*\n- .github/workflows/ci.yml: build + twine check + import smoke (py3.10-3.12)\n- add MIT LICENSE (from monorepo python/LICENSE) and .gitignore\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: standalone repo setup (OIDC publish, CI, LICENSE, gitignore, U…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-22T02:14:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "23c4e8dfada6078c1d846c68f24265ca8344f1c3",
          "body": "chore(memory): align Decision Memory storage+config surface to \"decisions\"",
          "is_bot": false,
          "headline": "Merge pull request #143 from KumihoIO/chore/decisions-project-rename",
          "author_name": "KaveOne | Kumiho",
          "author_login": "kaveone",
          "committed_at": "2026-07-22T01:59:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "ca97bc9e870920f696ca950b5f4d05b1231e5b9c",
          "body": "fix(memory): redact conversation content before the LLM, on all three legs (#138)",
          "is_bot": false,
          "headline": "Merge pull request #139 from KumihoIO/fix/pre-llm-redaction-conversation",
          "author_name": "KaveOne | Kumiho",
          "author_login": "kaveone",
          "committed_at": "2026-07-22T01:59:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d123da7d4e627b048f8ed8a31a8ab735a56f439a",
          "body": "Adversarial-review fixes on the Decision Memory storage/config rename:\n\n- DECISION_MEMORY_DESIGN.md: the §1.1 project-layout diagram and the\n  §Open-questions entry still declared the storage project as\n  `{agent_project}-code` / `-code` 접미 project, contradicting §6 and the\n  code (resolve_project_n\n[…]\nhape it validates.\n  Purely the seeded label — it is passed directly and never routes through\n  resolve_project_name, so behavior is unchanged.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(memory): finish -decisions rename in design doc + dogfood fidelity",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-20T13:37:06Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "18a7018bd6be277f3e993172a0d3a6bc8e8e9d09",
          "body": "…ions\"\n\nRename the storage project suffix and the operator env-var family from the\n\"code\" spelling to the product name \"decisions\", the last cheap moment before\npublic promotion.\n\nStorage: resolve_project_name() now derives f\"{project}-decisions\" (was\n-code). The physical-isolation guard is unchange\n[…]\ncommit/evidence), and internal module/symbol names (code_decisions.py,\nCodeMemoryConfig). Historical RELEASE_NOTES entries are left as shipped.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(memory): align Decision Memory storage+config surface to \"decis…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-20T13:18:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "049d918e1c52a656bde9b0737088132a34b3cf24",
          "body": "…(#138)\n\nReview follow-up on the #138 pre-LLM gate. The first cut mirrored the\nline-oriented code_capture/code_session policy verbatim, which propagated\nthree defects and left two of the file's LLM-bound paths open.\n\nprivacy.py — new PIIRedactor.redact_credentials(text) -> (text, count)\n(additive; r\n[…]\na KNOWN, now\ndocumented boundary — #138 closes what a provider sees, not what the graph\nholds; screening the stored transcript is its own call.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): span-level pre-LLM credential screening, all three legs …",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-20T01:50:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a26c3c2e20e00b6278d3449e1efff9716c4bc1a5",
          "body": "consolidate_session handed RAW buffered messages to BOTH\nsummarize_conversation and generate_implications; redaction ran only on\nwhat came back. Two pre-LLM leak paths, not one.\n\nBuild a redacted COPY of the transcript and pass it to both calls. The\noriginal messages stay untouched — the verbatim tr\n[…]\nolidation, and must never leak either.\n\nThe post-LLM anonymize_summary layer over the model's OUTPUT is unchanged\nand remains the second layer.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): redact conversation messages BEFORE the LLM (#138)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-20T01:29:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "604392692ad71186a37fe3a8fe9b88040c9cc7de",
          "body": "…ng (#136)\n\nAdversarial review findings 1 & 2 (PLAUSIBLE): the explicit-project\ndecompose test asserted space paths + node counts but never verified that\nthe DERIVED_FROM provenance edge is actually wired when the materialization\ntarget differs from the source revision's project — leaving requiremen\n[…]\nompose check before relying on cross-project provenance. No production\ncode change; decompose stays best-effort (never raises over a bad edge).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(memory): assert cross-project DERIVED_FROM/ABOUT provenance wiri…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-19T14:11:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8fbcd2d5aee9176d070f9d9df7c38fb6ddabf381",
          "body": "kumiho_memory_decompose materialized typed nodes only into the manager's\nown configured project. Add an optional `project` parameter threaded\ntool -> manager -> ontology so an agent can route the entities/facts/\nrelations into a different project, defaulting to today's behavior when\nomitted.\n\n- mcp_\n[…]\nn is\nbyte-identical (identical threaded args, zero probe); unresolvable and\nraising probes fall back without raising; schema exposes `project`.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): optional project target for keyless decompose (#136)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-19T14:01:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "99942c20cca29042183ba39ebe5a2a6cda5fb30a",
          "body": "…uard\n\nfix(memory): block G6 fact-dedup merges on negation/weekday asymmetry",
          "is_bot": false,
          "headline": "Merge pull request #135 from KumihoIO/fix/embedding-dedup-asymmetry-g…",
          "author_name": "KaveOne | Kumiho",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T16:58:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "0b6e51cb6b18fb20bdaa248d161aabe54954dc08",
          "body": "Live gate-check against a real local CE server (2026-07-19) found that\napply_embedding_fact_dedup's lexical-Jaccard confirmation gate can be\nfooled by high token overlap that hides a polarity flip or a differing\ncritical detail: \"the user is happy\" vs \"the user is NOT happy\"\n(Jaccard 0.889) and a me\n[…]\nAIN_GRAPH, also default OFF, so today's\nblast radius was contained — this closes the gap before either is ever\nconsidered for a default-ON flip.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): block G6 fact-dedup merges on negation/weekday asymmetry",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T16:52:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d5a9654b0e6ddd896931c01cf23d649ff409cca",
          "body": "…y, #86 #118 #119)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(kumiho-memory): 0.19.0 -> 0.20.0 (ontology Phase 3 + reliabilit…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T15:27:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f7094e33bbc4052b957b0d97208072b0c1c9bd37",
          "body": "…eep both: event_date_confidence + valid-interval marker)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "Merge origin/main into feat/ontology-phase3 — resolve #131 overlap (k…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T15:13:08Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "17cc855528ac60df72d283920483141d2dbcceda",
          "body": "fix(temporal): guard event_date against hallucinated LLM dates (#119)",
          "is_bot": false,
          "headline": "Merge pull request #131 from KumihoIO/fix/event-date-guard",
          "author_name": "KaveOne | Kumiho",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T15:09:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3b126fd2a3d735eca0098cdb43e7d33ae804e769",
          "body": "Address findings from adversarial review of the LLM-failure-parking work:\n\nCONFIRMED:\n- failure_ledger._load: read the ledger as bytes and decode explicitly so an\n  invalid-UTF-8 file (disk corruption, interrupted write, tampering) is treated\n  as corruption -> start fresh, instead of raising Unicod\n[…]\n missing\nitem-kref, payload-key fallback, ledger-error swallow). Full suite 933 passed,\n3 skipped (2 pre-existing env-drift failures unrelated).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(kumiho-memory): harden #118 parking ledger per adversarial review",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T12:35:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "40ab18fb3170fdb1c4a7a88a36feae9ce9088b3c",
          "body": "…xes (#119)\n\nAdversarial-review follow-ups on the event_date corroboration guard.\n\n- In-content anchor derivation (CONFIRMED #1/#3): relative-date derivation\n  now resolves against the absolute dates literally present in the source,\n  not only the message's wall-clock ingest timestamp. redis_memory.\n[…]\n/this-period branches and the conflict-guard\nreject branch. Full suite: 908 passed (2 pre-existing env-drift failures\nunrelated to this change).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(temporal): anchor relative derivation on in-content dates + KO fi…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T12:11:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "76f064b8aecee94169c761b0b2f55c315ca79be2",
          "body": "…path (G5)\n\nAdd reuse + flag-off duplicate cases through _sync_decompose so both decompose\npaths (summarizer + keyless agent) that share the resolver are covered.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(kumiho-memory): cover the summarizer decompose alias-resolution …",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T12:07:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "69a672c51b910486f0a1ba4de90dbd49cbe4afa7",
          "body": "…ding fact dedup, G8 valid-time intervals (#86)\n\nAll three items are additive and flag-gated default-OFF (epic gate: additive-only,\nno migration/renames; default-ON flips are later paired-bench decisions).\n\nG5 — write-time entity alias resolution (KUMIHO_MEMORY_ALIAS_RESOLUTION, default\nOFF). Before\n[…]\n + DreamState flag wiring; G8 interval grammar/edge cases + as-of demotion +\nflag-off byte-identical regression + write-side metadata isolation.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(kumiho-memory): ontology Phase 3 — G5 alias resolution, G6 embed…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T12:02:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9f18de8d96df3be96e24b1300fdf50682fcfb7d9",
          "body": "…king ledger (#118)\n\nretry.py classified transient vs non-transient only, so deterministic-failure\ncontent (validation errors, content-filter refusals, 4xx semantic rejections)\ncould be re-selected and re-fail run after run in Dream State / consolidation\n(a poison loop). Import memory-bank's pattern\n[…]\nnsolidation store seam; TTL un-park;\nconcurrent writers do not corrupt; absent ledger file = clean start; assessment\nisolation + systemic guard.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(kumiho-memory): 3-way LLM failure classification + cross-run par…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T11:57:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e94f298e46f4f94cb2888a15fdd6f3d64f887c13",
          "body": "event_date is an LLM-extracted valid-time field validated only by a\nprecision-aware FORMAT regex, so a well-formed but hallucinated date\npasses cleanly and pollutes the event-proximity ranking boost at recall\n(Hugh Kim review §2 caveat 3).\n\nAdd a CONTENT gate. New module `temporal_guard.classify_eve\n[…]\nguard + regression\ntests in test_recall_rerank.py; storage-wiring integration tests\n(verified / unverified / derived) in test_memory_manager.py.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(temporal): guard event_date against hallucinated LLM dates (#119)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T11:45:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb122045c2a4921eea14a4dc127ee854c22dbfe9",
          "body": "…ampaign; near-clone corpus ingest is the sole intervening write\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(memory): gate note timeline correction — backfill predates the c…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T05:54:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b3973a282db3a1eb18d754e5734c49702236e8b6",
          "body": "…rpus-global BM25 coupling (kumiho-server#28), not a server migration\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(memory): correct 0.19.0 gate note to the verified mechanism — co…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T05:51:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b5833ecffa928920caf69e45e3cc600242280df8",
          "body": "…development server, not a shipped migration\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(memory): correct 0.19.0 gate note — bench env ran unreleased in-…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T05:46:35Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4a70961399c459cf79a7dff08ab134ec5fa32cbf",
          "body": "…kstream, #86)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(kumiho-memory): 0.18.0 -> 0.19.0 (ontology Phase 2 + review wor…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T05:44:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "1142426e9c901fc3cd7094b7974c6c93c934784a",
          "body": "…ently (#106 follow-up)\n\nThe 0.19.0 RC gate measured the marker text itself regressing capped\ncontexts: paired per-question analysis showed marker-carrying questions\nat -0.055 vs baseline (n=478) while marker-free questions were +0.027 —\nthe answer model hedges when told content was cut (adversarial\n[…]\nthe cut is genuinely useful and\nbench-irrelevant. Budget unification stays; docstrings carry the\nmeasurement so the fork isn't re-unified blind.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): truncation marker is engage-only — bench path slices sil…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T03:21:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ec331bf3c9801bb405746b4f4a54de63362a0d89",
          "body": "…proven idempotent retry (#98)\n\nStructural profile: the observed MCP -32001 was git resolution (<=50s\nworst) plus one monolithic write phase (60s write_timeout) exceeding\nthe MCP client's 60s budget. capture_decisions now runs under an\noverall 45s deadline (KUMIHO_MEMORY_CODE_CAPTURE_DEADLINE) with\n\n[…]\nction —\ndouble-run and partial-then-retry produce identical graphs (tested).\nLive cloud p95 measurement is the documented follow-up.\n\nCloses #98\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): code_capture total-time deadline with partial success + …",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T01:32:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7b651a8a8d470ca15df8c2b838681a89ad0170c",
          "body": "…n marker placeholder (#117)\n\nThe commit-mining packet now passes the session path's exact pre-LLM\npolicy before reaching any adapter: PII anonymized in place per line,\ncredential-bearing lines replaced with [redacted] — content screened,\nstructure (hunk headers, paths, labels) preserved so extracti\n[…]\nhe\nsession side: a credential-dropped session_line becomes [redacted]\ninstead of \"\", so the embed-all-metadata fallback can't fire.\n\nCloses #117\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): pre-LLM packet anonymization on the commit path + sessio…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T01:09:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "032b824b5bab9017d88f1fcea83424b3c78b9cf8",
          "body": "…ve proposals (#108)\n\nEvery LLM-proposed deprecation now passes keyless deterministic guards\nbefore execution: min-age (fail-closed on unknown age, env-tunable),\nevidence severity (official never LLM-deprecatable; corroborated needs\na substantive reason) read as the MAX across metadata AND tags, and\n[…]\n, fail-closed, injection-fenced) for operators who\nwant a paid second layer. Proposed/guarded/refuted/executed stats in\nthe report.\n\nCloses #108\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): independent verification layer on Dream State destructi…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T00:54:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bea000e519696673b5143b06a8302a80735bd7cb",
          "body": "…ounting (#106)\n\nOne source of truth (CONTEXT_BUDGET_CHARS, env\nKUMIHO_MEMORY_CONTEXT_BUDGET_CHARS, default 8000 = the benchmark\npath's historical value): compose_context and build_recalled_context\nnow share the budget, a hard-ceiling truncate_section (marker inside\nthe limit), the truncation marker\n[…]\n sections carry the\nin-budget marker — measured at the 0.19.0 full-10 RC gate.\nchar_limit=0 keeps origin semantics (empty content).\n\nCloses #106\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): unify context assemblers under one budget with token acc…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-18T00:21:52Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2f92f4db03045f2176ef9ca3b6d8f6da15f06cac",
          "body": "…105)\n\nEvery traversal budget window now processes edges in a deterministic\npriority order instead of server arrival order: dispute-basis belief\nedges (CONTRADICTS/SUPERSEDES with basis agent/evidence-assessor)\nfirst, positive whitelist edges second, with a stable\n(edge_type, reached-kref) tiebreak \n[…]\nped selections use\nheapq.nsmallest on high-degree anchors. The contract ships in the\nontology spec (v3) so agents can commit to it.\n\nCloses #105\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): deterministic belief-safety-first traversal contract (#…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T22:57:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b4647542c55692b09cefa1b55502557ea1d21ae3",
          "body": "…s guard\n\nLive gating on the full-10 corpus surfaced that recall scores carry a\nwall-clock recency prior (pre-vs-pre drift ~1e-6 on identical code), so\nexact byte equality is unattainable by design. The harness gains a\n--compare mode: exact structural/order/content equality with score\nfloats within \n[…]\nresult for this branch: PASSED against the ingested full-10 corpus\n(91 sibling-bearing results, pre=main vs post=branch structurally\nidentical).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(memory): bytediff harness — tolerance compare mode + non-vacuou…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T21:54:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1f276be9b16652b4eb753d51823d8434128eadef",
          "body": "…ranking (#97, #102)\n\nThe graph-augmentation wait loops now bridge the daemon worker's\ncompletion to the running loop (call_soon_threadsafe + wait_for)\ninstead of polling at 0.5s — recall wakes the instant traversal\nfinishes, removing the ~0.25s-average artificial floor; timeout\nsemantics byte-ident\n[…]\nils the run).\n\nAdversarially reviewed: five cross-thread race scenarios verified safe,\nper-item independence confirmed, no correctness findings.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "perf(memory): event-driven recall waits + bounded parallel sibling re…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T18:01:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6d3e00048d485511d581aae1ff6edf51b30817ff",
          "body": "…D retry, locked singleton (#103)\n\nRecall/engage MCP results now carry an additive backend_error field\nwhen the retrieve backend actually failed (empty-but-healthy stays\nbyte-identical, signal reset per call, read under the recall lock);\n_generate_session_id retries Redis once with backoff and logs \n[…]\nept:pass; _get_manager\nuses a double-checked threading.Lock so concurrent first calls can't\ndouble-create the manager/Redis client.\n\nCloses #103\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): surface silent failures — backend_error field, session-I…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T17:26:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aeb1e2ad30536b1cd26028f6d464ef515ca0450c",
          "body": "… release checklist (#107)\n\nCloses #107\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(memory): align version surfaces — README status, pyproject URLs,…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T17:11:48Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "186e2ab7e956398357341f1cc419547a276c558f",
          "body": "api_key_generic now matches hyphenated modern keys (sk-proj-, sk-ant-)\nvia an entropy-run lookahead (>=20 unbroken alnum chars in the tail) so\nhyphenated prose like 'sk-learn-based-approach' stays clean; adds JWT\n(double-eyJ anchored), Google AIza, Slack xox[baprs], and DB URLs with\ninline passwords\n[…]\neral-pipe typo. Module docstring now\nstates the detector is probabilistic best-effort with enumerated\ncoverage — never a guarantee.\n\nCloses #101\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): modernize credential detection patterns (#101)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T17:10:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e9451781781a4def8d844bfb73deea799ef6114",
          "body": "External SKILL.md content now passes a deterministic, keyless scan\nbefore storage: hidden/bidi unicode payloads, high-precision injection\nheuristics, and embedded credentials. Flagged content is stored for\naudit but quarantined — no agent_compat, never tagged published, with\nquarantine metadata + mi\n[…]\nide narrowed to\njailbreak shapes, ZWJ/ZWNJ excluded (emoji/Persian/Indic load-bearing,\ntradeoff documented), leading BOM tolerated.\n\nCloses #100\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): static scan + quarantine for skill ingestion (#100)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T16:56:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dd4b9d034280b57ca3c95cb2d244f9806f38f7bb",
          "body": "…ession mining (#99)\n\nCommit messages, decision prose, evidence text, symbols, and source_ref\nnow pass the session path's per-atom gate before reaching the cloud\ngraph: credential-bearing atoms drop (counted), PII redacts in place,\nclean content stores byte-identical. Always-on (default PIIRedactor\n\n[…]\nstats=None guard, and a credential-bearing\nsubject becomes \"[redacted]\" so write_revision's embed-all-metadata\nfallback never fires.\n\nCloses #99\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): commit-mining path passes the same privacy boundary as s…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T16:17:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb2d4dd7f3d25ad96419bfe9ac1ee6b13fe4cbf7",
          "body": "feat(memory): ontology Phase 2 — explicit belief change, first-class CONTRADICTS, grounding ripple",
          "is_bot": false,
          "headline": "Merge pull request #96 from KumihoIO/feat/ontology-phase2",
          "author_name": "KaveOne | Kumiho",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T15:48:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "52aba596118b2b77ed57c66650df451ec98c6142",
          "body": "…wn (#104)\n\nCONFIRMED via structural repro: MCP handlers run asyncio.run per tool\ncall, so the bare create_task(_background_assess) was cancelled at loop\nteardown — evidence grading (and the #94 CONTRADICTS bridge riding in\nit) silently never completed via MCP, the primary deployment mode. The\nasses\n[…]\nval mechanism\ndecompose/consolidation already use. Regression tests demonstrate both\ndispatch modes and fail on the unpatched code.\n\nCloses #104\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): background auto-assess survives MCP per-call loop teardo…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T15:48:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d657fb4ee306538a8b4f20e012327e29ffd1da7c",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(memory): acknowledge Hugh Kim's v0.18.0 deep-dive review",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T15:26:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "6fc0c6cf724e0a798b48103c3e9054088381c3b6",
          "body": "…2, sibling notes, bridge gate (#93 #94 #95)\n\nThree-lens adversarial review fixes: contested markers and whitelist\nsurfacing now require a dispute basis (agent / evidence-assessor) so\nentity-relation CONTRADICTS domain claims from the predicate registry\nnever read as memory disputes; the ontology sp\n[…]\nsibling branch; the assessor bridge\ngains a create_contradicts_edges kill-switch (default ON); the\nself-supersede guard also compares kref uris.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): Phase 2 review hardening — dispute-basis scoping, spec v…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T12:01:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e9ab3df20dd184de02fadc4f2462218f2a446bf3",
          "body": "Superseding a fact now ripples to its dependents: revisions with a\nDEPENDS_ON edge into the superseded fact are stamped\ngrounding_stale=true (+ mirrored grounding:stale tag and a pointer to\nthe superseding fact) from both the heuristic and agent-declared\nSUPERSEDES paths — deterministic, keyless, ca\n[…]\nDream State pass clears flags whose grounding was\nre-confirmed or whose superseding fact is gone. Closes the paper's\ndeferred section 15.6 loop.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): grounding-staleness ripple on SUPERSEDES (#95)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T11:35:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "77f74717cc2a52242455997ff1d37677411061e1",
          "body": "…list, contested markers (#94)\n\nAssessor conflict verdicts now become graph structure: conflicting_krefs\nbridge to directed CONTRADICTS edges (basis=evidence-assessor,\nidempotent, best-effort) beside the existing metadata write. The\ngraph-augmented reader traverses CONTRADICTS like SUPERSEDES, stamp\n[…]\nound-trips (piggybacks the existing edge fetch), and composed context\nrenders a one-line disputed note — additive only, no removal or\nrescoring.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): CONTRADICTS first-class — assessor bridge, reader white…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T11:10:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "98fc9b221137378dc1a3c92000ad189f842154f3",
          "body": "…the in-loop agent (#93)\n\nBelief-change edges can now come from the agent that read the\nconversation: optional supersedes/contradicts lists on decompose land\nas SUPERSEDES/CONTRADICTS edges with basis=agent metadata, resolving\ntargets against this call's facts, existing fact items, or krefs —\nunreso\n[…]\nuessed. The lexical fallback\nkeeps working, is now labeled basis=lexical-overlap, and yields to an\nexplicit agent declaration for the same fact.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): decompose accepts explicit supersedes/contradicts from …",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T10:54:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "175f5cde1eb5ea2a53f6887a5f9ed4577dff9c1a",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(kumiho-memory): 0.17.4 -> 0.18.0 (ontology Phase 1, #86)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T08:16:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "833c9575fe5c63082fe396eb4eddcea586d47b43",
          "body": "…ons win global budget (#90)\n\nAdversarial-review fixes: (1) the sibling-cap break no longer\nshort-circuits relation-edge collection when the flag is on (order-\ndependent reachability loss; flag-OFF keeps the exact historical early\nexit); (2) global neighbor/result budgets now consume specific\nrelati\n[…]\n) docstring mentions the INVOLVES hop; test pins that stray\nnon-canonical edge types are never traversed. New tests proven against\npre-fix code.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): relation traversal survives sibling cap; specific relati…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T06:12:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7a3429d345507ab43fbe91b27c303604204a04f3",
          "body": "With KUMIHO_MEMORY_RELATION_TRAVERSAL=1, the entity-mediated reader\nfollows registered entity->entity relation edges (both directions) from\nABOUT-reached anchors to neighbor anchors, then hops incoming\nABOUT/INVOLVES to their content-bearing memories — relation edges are\nfinally readable at recall. \n[…]\nmmed first, hub-degree guard\nreused, direct hits never evicted, hop provenance recorded. Default\nOFF pending the pair-measured LoCoMo/Plus gate.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): flag-gated traversal of registered relation edges (#90)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T05:53:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "dea7563690ad826b235b6c729403e2d3c08d4f2d",
          "body": "…mapping (#88, #89)\n\nThe ontology spec (node kinds w/ definitions, edge semantics, predicate\nregistry, trust mapping) now persists as a versioned policy Item\n(ontology/spec.policy, tag ontology.spec) seeded best-effort at skill\ningestion — any agent can fetch it via get_revision_by_tag and commit\nto\n[…]\ng: certainty/confidence are\nself-reported strength, evidence_level is a provenance grade; bands are\ntie-breakers only and never lift provenance.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): ontology spec as tagged policy Item + trust-vocabulary …",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T05:36:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3502dd64b006ad81f42d37753830cfc87c125b99",
          "body": "…ing (#87)\n\nAgent relation predicates now fold onto 10 canonical edge types\n(DEPENDS_ON, USES, IMPLEMENTS, PART_OF, SUPERSEDES, SUPPORTS, CAUSES,\nCONTRADICTS, CONTAINS, RELATES_TO); unregistered or unnormalizable\npredicates (incl. CJK) become RELATES_TO with the verbatim predicate\nand normalized token preserved in edge metadata — relations are no\nlonger silently dropped, and the vocabulary no longer fragments.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): canonical relation predicate registry with synonym fold…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T05:22:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7fc2893173f91216872b67f577c77967336645cf",
          "body": "Gruber-principles audit of the typed memory graph: 8 verified gaps\n(adversarially refuted, file:line evidence) and a 3-phase additive plan.\nPhase 1 = predicate registry (#87), spec policy Item (#88), trust-vocab\nmapping (#89), flag-gated relation traversal (#90).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(memory): ontology principles gap analysis + phased plan (#86)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-17T05:12:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "4597870304407e627e87b43928d8e24d5a6f7de1",
          "body": "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(kumiho-memory): 0.17.3 -> 0.17.4 (_run_git LOW hardening, #82)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-16T14:27:58Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "df06ff7d0a5496946874c9bd3e0200e7d70f82cc",
          "body": "From the 2026-07-16 adversarial review of the #79 fix:\n\n- L1: the re-raised TimeoutExpired now carries the post-kill drained\n  output/stderr when the grace communicate() succeeds -- parity with\n  subprocess.run, so callers diagnosing WHY git stalled get real bytes.\n- L2: the abandon path closes our \n[…]\now models pipes (close tracked + asserted) and a new\n  _SlowDrainProc covers the grace-success path end to end.\n\n23/23 tests pass.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(code-capture): resolve remaining LOW review findings in _run_git",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-16T09:14:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "80e4d353d399cec30a03ea6bc027fa4b32fa3314",
          "body": "Bumps pyproject.toml AND kumiho_memory/__init__.py together (the 0.17.2\nlesson) and adds release notes for the Windows _run_git hang fix (#79/#80).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(kumiho-memory): 0.17.2 -> 0.17.3 (bounded _run_git kill path, #79)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-16T04:04:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "75a17ae376adc5349c748763b639dbf1e535be2a",
          "body": "Adversarial review caught a parity regression in the Popen rewrite: CPython\nsubprocess.run wraps its whole body in a bare except that kills the child\nbefore re-raising (Lib/subprocess.py:565), so a KeyboardInterrupt during\ncommunicate() never leaked a live process. The new _run_git only handled\nTime\n[…]\nt\nkills the child and re-raises, plus a regression test asserting the child\nis killed when communicate() raises KeyboardInterrupt.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(code-capture): kill the git child on any escape from communicate()",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-16T03:21:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b8333c7dbe2fac565dded1779f8c11aa78056500",
          "body": "_run_git trusted subprocess.run(timeout=...) to bound every git call, but\non Windows the TimeoutExpired path inside subprocess.run calls kill() and\nthen a timeout-less communicate(). TerminateProcess is asynchronous: a git\nchild stuck in uninterruptible kernel I/O (Defender scan, disk stall) or a\nde\n[…]\nne that models\nthe stuck-pipe failure mode and asserts every wait -- including post-kill --\ncarries an explicit bound.\n\nFixes #79.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(code-capture): bound the post-kill wait in _run_git (Windows hang)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-16T02:48:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5821f6e0e9685d98884d40795b7d16fdc58a352b",
          "body": "…orted 0.17.0)\n\npyproject was bumped to 0.17.1 but __init__.py's hardcoded __version__ stayed\n0.17.0, so the released package under-reported its version. No functional change.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(kumiho-memory): 0.17.2 — correct __version__ string (0.17.1 rep…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-15T06:10:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "7597b9984a11fe02552c4fc5fdec5b1bdd8bcece",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(kumiho-memory): release notes for 0.17.1 loop-aware Redis client",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-15T05:50:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "738668c991827cc80ef064bac3eb4a2b1d85704e",
          "body": "…vives (0.17.1)\n\nRedisMemoryBuffer created its redis.asyncio client once and cached it. Because a\nredis.asyncio connection binds to the event loop of first use, a caller that runs\nseveral asyncio.run() calls in one process — History Backfill replays one reflect()\nper session, each under its own fres\n[…]\nAdds regression tests: owned client rebinds across event loops; injected client\nis never recreated. Full redis_memory + mcp_tools suites green.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(kumiho-memory): loop-aware Redis client so repeated reflect() sur…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-15T05:40:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a349d9e9d851f627cc38c47fbefae2364f159bf7",
          "body": "… + capture_results)\n\nCompletes the batch write path for history backfill. reflect gains an\n`idempotency_prefix` parameter (threaded to tool_memory_store_batch; forces the\nbatched path for any capture count so the result shape is consistent) and returns\na positionally-aligned `capture_results` list \n[…]\nlidated end-to-end against a local CE 1.6.3 via\nthe backfill ingest_runner (batch path, capture_results, idempotent resume).\n\n0.16.3 -> 0.17.0.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(kumiho-memory): reflect bulk-replay contract (idempotency_prefix…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-15T04:03:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "df484f086b0edec4c9923d0840fada9d988e2ba3",
          "body": "…ions\n\nA reflect with >=2 captures (history backfill and any bulk write) now lands in\nONE BatchCreateRevisions transaction instead of N per-capture tool_memory_store\ncalls — removing the neo4j relationship-group deadlock that per-capture\nconcurrency triggers at bulk volume and collapsing the heavies\n[…]\nvent_date parity\n\nValidated live against CE 1.6.3; adversarially reviewed (embedding-basis\ndivergence + >200 chunking findings both addressed).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(kumiho): batch multi-capture reflect writes via BatchCreateRevis…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-15T03:05:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0f818fd17d98029a1cb0e343b71fe006c206e2e6",
          "body": "Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): kumiho-memory 0.16.1 -> 0.16.2 (reflect event_date, #68)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-14T08:57:25Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5bc0302875694c8603aad95582c0cdc7a113e73c",
          "body": "…) (#68)\n\nkumiho_memory_reflect is the keyless write path, but its capture schema had\nno event_date and the handler dropped metadata — so agent-written memories\ncould not carry valid-time. A memory reflected today about something that\nhappened in March stored created_at=now with no event_date, so te\n[…]\n\nTests: 3 new cases (valid/partial, invalid/relative dropped+reported, absent\nunchanged); full test_mcp_tools.py green (34 passed).\n\nCloses #68\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(kumiho-memory): let reflect captures carry event_date (valid-time…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-14T08:26:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cffa5dece00a567954cdf728fd4a62a8b22c891c",
          "body": "…out)\n\nShips the #64 fix: a 20s ceiling on every git subprocess in code_capture so\nkumiho_code_capture can't hang indefinitely on a stuck git. Bug-fix only.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): kumiho-memory 0.16.0 -> 0.16.1 (code_capture git-time…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-14T02:03:49Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3b0180482ded33afce827063c8a69d0fcb2df8bd",
          "body": "… hang\n\nThe keyless capture (`capture_decisions`) resolves git — `derive_repo_id` +\n`_commit_info_for_ref` — OUTSIDE the write bound (the graph write runs in\n`run_bounded_in_thread` with `write_timeout=60s`). `_run_git` called\n`subprocess.run(...)` with NO `timeout`, so a hung git (a stuck\ncredentia\n[…]\nread`\nabandons the stalled gRPC call as a daemon thread (Python can't cancel a\nthread); repeated timeouts leak threads until the process exits.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(code-memory): bound git subprocesses so kumiho_code_capture can't…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-13T14:57:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d4dc2413b6364b4a015d4ac508c525d9ae544eb",
          "body": "test(kumiho-memory): fix stale tool counts and sys.modules['kumiho'] pollution",
          "is_bot": false,
          "headline": "Merge pull request #60 from KumihoIO/fix/kumiho-memory-test-pollution",
          "author_name": "KaveOne | Kumiho",
          "author_login": "kaveone",
          "committed_at": "2026-07-13T13:05:01Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fad014cb37eb0ec1ec44d6f30a548f758682c63",
          "body": "…ntenance)\n\nVersion bump + RELEASE_NOTES for #59: Dream State now maintains the typed\nontology and Decision Memory graphs (keyless deterministic pass — entity\nmerge, fact dedup, orphan prune, code-decision evidence re-grade + dedup,\ncross-graph ABOUT bridge — plus an optional LLM entity-merge applied through\nthe same keyless write path). Shipped in PR #62; the live-CE dogfood\nscripts/dogfood_dream_maintenance.py is already on main.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): kumiho-memory 0.15.0 -> 0.16.0 (Dream State graph mai…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-13T12:22:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "025fe9d4b748d976d3ffbce45c6799211749db6e",
          "body": "…hs (#59)\n\nDream State assessed only flat conversation revisions; the typed ontology\n(entity/fact) and Decision Memory ({repo}-code) graphs were never\nconsolidated. This adds a graph-maintenance pass, split by the keyless\nconstraint.\n\nKEYLESS deterministic (graph_maintenance.py, no LLM key):\n- entit\n[…]\n-dedup SUPERSEDES-cycle guard, one-pass transitive\nalias chains, prune-after-bridge ordering, and run-abort isolation.\n\nRefs #57, builds on #6.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dream-state): maintain the typed ontology & Decision Memory grap…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-13T10:01:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7e55529ca901bb919d514dd50e844f68c6fb1e7d",
          "body": "…pollution\n\nTwo clusters of pre-existing full-suite failures (both green in isolation):\n\n- Stale tool-count assertions: MEMORY_TOOLS / MEMORY_TOOL_HANDLERS are 14\n  since kumiho_memory_decompose was added in 0.14.0; bump expected 13 -> 14.\n\n- Test pollution at the fake-kumiho sys.modules seam: helpe\n[…]\ne 2 remaining are known env-drift\nnoise (test_recall_memories_with_no_retriever,\ntest_anthropic_provider_defaults_are_current), left untouched.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(kumiho-memory): fix stale tool counts and sys.modules['kumiho'] …",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-13T09:06:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc2982005e07554a5baf80483651722ddda34501",
          "body": "Version bump + RELEASE_NOTES for the §6 Level-of-Evidence ranking feature,\nplus scripts/dogfood_loe_code.py — the keyless live-CE proof that a code\ndecision captured with a measurement atom self-grades 'corroborated' and\nmaterializes as a code_decision node with IMPLEMENTED_IN anchors and\nMOTIVATED_BY evidence.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): kumiho-memory 0.14.1 -> 0.15.0 (LoE code_why ranking)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-13T06:21:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a98eec31d1877504ee4d514c9fffd241f4cefcee",
          "body": "Code decisions carried no evidence grade, so code_why ranked a thin\ncommit-message decision the same as an empirically-measured one. Two\nsurgical, keyless changes:\n\n- code_capture: stamp a deterministic evidence_level on each decision from\n  its evidence atoms (measurement/review_finding/benchmark/i\n[…]\nce_grade atom mapping; corroborated>unverified tie-break;\nungraded no-op. Full suite 536 passed (2 pre-existing env-drift failures,\nunrelated).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(code-memory): Level-of-Evidence ranking in code_why (§6)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-13T06:17:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d4333d8d2e59dd25c6a30126d6538a86f8388597",
          "body": "…y {}\n\nOntology decomposition is a run of blocking gRPC writes (one round-trip\nper node and per edge). Against a cloud backend a decomposition takes\n~25s, which tripped the old 25s run_bounded_in_thread deadline: on\ntimeout the wrapper returned an empty {} while the un-cancellable daemon\nworker kept\n[…]\ninstead of a bare {}. Applies\nto both decompose_and_link_agent (keyless tool) and consolidation-time\ndecompose_and_link. Bump 0.14.0 -> 0.14.1.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ontology): decompose no longer reports a successful write as empt…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-13T04:38:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7910e78d355282bde2c3328c8aff11df8cb9ce97",
          "body": "…mposition)\n\nMinor bump for the new keyless kumiho_memory_decompose feature. No new core\ndependency (kumiho>=0.10.5 unchanged).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): kumiho-memory 0.13.0 -> 0.14.0 (keyless ontology deco…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-13T03:37:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5f022127fe3b651ebb6250f02b34464e1802dd0e",
          "body": "…ompose)\n\nThe Claude plugin must never use an external LLM key, but ontology decomposition\n(conversation -> typed entity/fact graph) ran only via the summarizer LLM at\nconsolidation, so under the keyless plugin the typed graph was never built\n(0 entity nodes). This adds the keyless path, mirroring k\n[…]\nmd must instruct the agent to call\nkumiho_memory_decompose after a substantive exchange (token-lean, from the\ncompact summary, salience-gated).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ontology): keyless agent-driven decomposition (kumiho_memory_dec…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-13T03:35:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "94fd3b01bba7aac3418e7b9d8f93b648e68a282c",
          "body": "…capture)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): kumiho-memory 0.12.1 -> 0.13.0 (keyless agent-driven …",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T15:52:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b3320ded99ce5a1737ce513ea3343b1b1cb12802",
          "body": "…mory capture\n\nThe plugin runs inside Claude; requiring a separate OpenAI/Anthropic key to\nextract the *why* betrays the point. kumiho_memory_reflect already proves the\npattern for conversation memory (the agent's own model identifies what\nmatters; the tool just stores it, no key) — this brings the \n[…]\nrnative round-trips. Unit: 87 code-domain\ntests (2 new — keyless write with anchor-union + hallucination drop, bad-ref\nloud error).\n\nIssue #43.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): kumiho_code_capture — keyless, agent-driven Decision Me…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T15:43:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9d35bffd824364d4294288032da063429ad545c4",
          "body": "Decision Memory imports kumiho._text.slugify, absent from published core\n0.10.4. Pin kumiho>=0.10.5 (the companion core release) so a clean\n'pip install kumiho-memory' actually resolves a working core.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): kumiho-memory 0.12.1 — require kumiho>=0.10.5",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T14:35:29Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "be3365cff581a1648e877de2cd23b7b08adce8b2",
          "body": "…mining)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump kumiho-memory 0.11.0 -> 0.12.0 (Phase 2 session …",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T14:21:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a71a7aeed9c5260aa07ff5d3bdd500436c9f1ef9",
          "body": "…closer)\n\nThe SDK half of closing the plugin loop. A commit hook mines WHAT landed;\nthis lets a SessionEnd worker mine WHY the session produced it.\n\n- parse_claude_transcript(): Claude Code / Cowork transcript JSONL ->\n  mine_session messages (text kept, tool_use marked, tool_result and\n  system-rem\n[…]\nKorean/English mixed form — the natural-session signal the design\npromised, on real conversation not a synthetic dogfood.\n\nIssue #43 (Phase 2).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): code-mine-session CLI + Claude transcript parser (loop-…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T14:11:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6b2594e8714aca65d300a00bf881c76f10e6618c",
          "body": "…s + crash-safety)\n\nThe other agent's adversarial-review commit (9daf38b) fixed the PII/spec\naxis; these are the correctness/crash-safety findings that survived. All\nfour are red->green pinned (each fails on the pre-fix tree with the test\nkept).\n\n- delta re-mine never refreshed the marker (critical)\n[…]\nprinciple). (code_session.py)\n\nSuite: 523 passed (+4), 3 skipped; the 2 failures are the pre-existing\nenv-drift baseline.\n\nIssue #43 (Phase 2).\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): 4 review findings the standards sweep missed (correctnes…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T13:34:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bda57e10d7989bd03280a77beb1518a5a002bc52",
          "body": "…ds sweep\n\nSpec-axis findings (vs SESSION_MINING_DESIGN.md at dde083a):\n\n- session_line PII/credential leak (critical): the first user turn fed\n  STORED embedding_text (session marker + every standalone decision) raw —\n  never redacted, never credential-screened, violating §5.1's single-text-\n  stre\n[…]\ne: 518 passed (+5 new), 4 skipped; the 2 remaining failures are the\npre-existing env-drift baseline (verified identical on the pristine\nbranch).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): session mining adversarial-review fixes — spec + standar…",
          "author_name": "Morpheus",
          "author_login": null,
          "committed_at": "2026-07-11T08:35:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "80ec8c82922a2550796aadcd32dda3dea31e4b97",
          "body": "Full-prose correlation text (0.14 vs 0.26 measured), S1 floor 0.25 -> 0.20,\nunique-suffix path resolution against ls-files.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(memory): session mining design — dogfood calibration amendments",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T05:12:53Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "a52ef136db74446ec10e5a2c1e7b34c2298baf46",
          "body": "…tion\n\nLive gate (scripts/dogfood_session_memory.py, CE at 127.0.0.1:9190,\nmachine-judged): enrich-not-create, additive constitution (before/after\nsnapshot byte-identical on the commit decision), the session-only rejected\nalternative surfaced by why() with session:* provenance, no ghost commits,\nsta\n[…]\nit suite: 29 passed (2 new: unique-suffix resolution, full-prose\ncorrelation regression pinned to the live-measured pair).\n\nIssue #43 (Phase 2).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): session mining live dogfood gate 7/7 + measured calibra…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T05:11:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "10df7b9cb9fc973155a8854cdcb7ed085dfe28a5",
          "body": "…e 2)\n\nThe commit records the winning choice; the session that produced it holds\nwhat the commit loses — rejected alternatives, measurements in original\nform, the moment agreement was reached. New code_session.py mines an agent\nsession's transcript into the code-decision graph per\ndocs/SESSION_MININ\n[…]\nry-surface). Full suite 512 passed; the 2 failures are pre-existing\nenv drift (verified identical on the pre-change tree).\n\nIssue #43 (Phase 2).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): session mining — the conversation as a why-source (Phas…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T05:01:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c55316afeea98a286481b2d78f92d44a207944f9",
          "body": "…independent drafts)\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(memory): Phase 2 session mining design (judged synthesis of two …",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T04:42:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9e26b745346711818605aec06a1ef4ea63938430",
          "body": "Phase 1's review verdict ('no client deprecate API') was too pessimistic:\nItem.set_deprecated exists at the item level. --force now works as the\ndesign originally specified: a pre-pass deprecates the commit's existing\nDECISION nodes (evidence atoms are verbatim-slug-shared across commits and\nnever d\n[…]\ncycle on a real synthetic repo — old generation retired,\nconverged items restored, fresh revisions written, status active.\n\nIssue #43 (Phase 2).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): true --force — deprecate-then-rewrite (Phase 2)",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T04:24:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91706959684bc7a2a29b5400520585be669c379f",
          "body": "README brought current from its stale 0.6.x status block: Decision Memory\nsection (opt-in gate, code-ingest/why usage, lexicographic fusion, belief\nrevision, physical isolation, live-verified pointer), write-time ontology\nand Decision Memory added to Features, MCP tools table extended to the\ntwo opt\n[…]\nntry (capture pipeline, 3-leg why(), sha-free\nidentity, surface, isolation + live dogfood + adversarial-review notes).\nVersion 0.10.1 -> 0.11.0.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(memory): release 0.11.0 — Decision Memory + consolidated README",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T03:44:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b5d17958e1ed4bca8cc706d2b424b6e9aba2b773",
          "body": "…findings\n\n4-lens review (isolation / write / query / design-fidelity), 33 agents,\nrefuter-verified: 29 raw -> 26 confirmed (2 critical, 12 major, 12 minor).\nAll confirmed findings addressed:\n\nCRITICAL — supersede demotion identity split: demotion wrote a NEW revision\nwhile every edge stays pinned t\n[…]\nsed; remaining 2 failures\nare the pre-existing env baseline (3 of the old 5 were incidentally cured\nby installing the openai extra).\n\nIssue #43.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): Decision Memory adversarial-review fixes — 26 confirmed …",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T03:34:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6adc66355507b5dd2fa3d3542811d88d9c8a2958",
          "body": "scripts/dogfood_code_memory.py: the machine-judged live gate from the\ndesign (§7.2) — mines this repo's own recent 40 commits into a live CE,\nthen asks the three questions an agent would ask and judges top-3\ndecisions by expected-commit provenance + verbatim-evidence substring.\n\nFirst live run score\n[…]\n (10f113e)\n\n40 commits -> 37 decisions, 35 evidence atoms, 65 anchors, 172 edges,\n0 errors, 7 LLM calls (~$0.03). Issue #43 success criterion 5.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): Decision Memory P3 — live dogfood gate passes 3/3",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T02:57:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "cc1fc316ff70a9eedaebcc692ce312adad286c54",
          "body": "The 8-stage capture pipeline (docs/DECISION_MEMORY_DESIGN.md §4):\nenumerate (git subprocess, zero new deps) → deterministic prefilter\n(false-negative-asymmetric: only certain noise cut — merges without body,\nlockfile-only, bumps; conventional-commit type is never a criterion) →\nmessage-first evidenc\n[…]\ncrash-injection proof that no marker survives a failed write.\nFull suite: 468 passed, failures identical to the 5-test env baseline.\n\nIssue #43.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): Decision Memory P2 — git commit-mining capture adapter",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T02:45:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f91e68ca9de29d3c0157c2acc4fc974d33eef428",
          "body": "…y() query\n\nImplements the deterministic half of the code-decision domain\n(docs/DECISION_MEMORY_DESIGN.md §9 P1):\n\n- code_decisions.py — single-source schema module: kinds/spaces/edge\n  constants, CodeMemoryConfig, normalize_path (write/query shared contract),\n  sha-free slugs (decision = title+auth\n[…]\n provably never imports the code modules). Full suite: 457 passed,\nfailures identical to the pre-existing 5-test env-drift baseline.\n\nIssue #43.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): Decision Memory P1 core — schema, git anchors, 3-leg wh…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T02:36:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "60f287ae6f96f1a77c2e2b29b6461a386340e2a1",
          "body": "…gn judge panel)\n\nIssue #43. Three independent designs (schema-first / capture-first /\nquery-first) were produced against the live codebase, scored by a 3-lens\njudge panel (implementability, query product value, non-rotting + capture\nquality), and synthesized: A's schema skeleton (24/30) + B's captu\n[…]\ntadata), commit\nmarker idempotency, verbatim-quoted evidence atoms, 3-leg lexicographic\nwhy() query, zero new dependencies, zero server changes.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(memory): Decision Memory Phase 1 design (synthesized from 3-desi…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-11T02:24:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d91d22cc83f7847969bc53eabe5212c11130c0de",
          "body": "… loop\n\nThe opt-in cross-encoder stage (KUMIHO_RERANK_CROSS_ENCODER=1) is CPU-bound\nONNX inference; called inline from the async recall paths it blocked the\nevent loop and serialized every concurrent recall (measured on the\n2026-07-10 full-LoCoMo run: a concurrency-4 harness degraded to ~1\neffective\n[…]\nntity routing for all three gate branches, and a\ncall-site guard so reverting either recall path to sync rerank fails the\nsuite. Version 0.10.1.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): offload the fastembed cross-encoder rerank off the event…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-10T14:08:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "90029fb646396121d772bcbd96d87a7be169a2d0",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(memory): align __version__ to 0.10.0 + note reformulate-draws knob",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-10T08:00:33Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d0a78ec1df2b40a2a013bb0121fa332d11b5a98e",
          "body": "…ion + implications parity\n\nThree read-side improvements from the LoCoMo-Plus miss autopsy:\n\n- compose_context now partitions bridge/fact evidence AFTER conversations\n  unconditionally — previously only when the top-K cut fired, so top_k=0\n  (unlimited) callers got a global score sort where typed on\n[…]\ndy carried them): prospective-indexing text is the\n  write-time answer to oblique future triggers, so revision selection must\n  score on it too.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(memory): unconditional additive partition + multi-draw reformulat…",
          "author_name": "kaveone",
          "author_login": "kaveone",
          "committed_at": "2026-07-10T05:24:57Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 1,
      "commits_last_year": 171,
      "latest_release_at": "2026-07-22T03:04:57Z",
      "latest_release_tag": "v1.0.0",
      "releases_from_tags": false,
      "days_since_last_push": 0,
      "active_weeks_last_year": 9,
      "days_since_latest_release": 7,
      "mean_days_between_releases": null
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "kumiho-memory",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "kumiho",
            "memory",
            "ai-agents",
            "redis",
            "cognitive-memory",
            "summarization",
            "conversational-ai",
            "mcp",
            "Development Status :: 5 - Production/Stable",
            "Intended Audience :: Developers",
            "Intended Audience :: Science/Research",
            "Operating System :: OS Independent",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Topic :: Scientific/Engineering :: Artificial Intelligence",
            "Topic :: Software Development :: Libraries :: Python Modules",
            "Typing :: Typed"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/kumiho-memory/",
          "is_deprecated": false,
          "latest_version": "1.1.0",
          "repository_url": "https://github.com/KumihoIO/kumiho-memory",
          "versions_count": 65,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": null,
          "first_published_at": "2026-02-09T08:37:26.470113Z",
          "latest_published_at": "2026-07-30T01:11:53.460936Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 0
        }
      ]
    },
    "popularity": {
      "forks": 0,
      "stars": 0,
      "watchers": 0,
      "fork_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_forks": 0
      },
      "star_history": {
        "days": [],
        "complete": true,
        "collected": 0,
        "total_stars": 0,
        "collected_at": null
      },
      "open_issues_and_prs": 2
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 159367,
      "source_files_sampled": 87,
      "oversized_source_files": 10,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "pyproject.toml"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "pypi"
      ],
      "dependencies": [
        {
          "name": "kumiho",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.10.7"
        },
        {
          "name": "redis",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=5.0.0"
        },
        {
          "name": "requests",
          "manifest": "pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.31.0"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 1,
        "open_issues": 2,
        "closed_ratio": 0,
        "closed_issues": 0,
        "closed_unmerged_prs": 0
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "kaveone",
          "commits": 160,
          "avatar_url": "https://avatars.githubusercontent.com/u/175288097?v=4"
        },
        {
          "type": "User",
          "login": "codex",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/267193182?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.994
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "publish.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": 10,
            "reason": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
            "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/28 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": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 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": 1,
            "reason": "dependency not pinned by hash detected -- score normalized to 1",
            "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": 10,
            "reason": "GitHub workflow tokens follow principle of least privilege",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 10,
            "reason": "0 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "17f2efb7a4fdf7c5d18a384adb6de8193270f1d1",
        "ran_at": "2026-07-30T01:18:35Z",
        "aggregate_score": 4.5,
        "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-30T01:11:57Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-07-30T01:10:36Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 1,
          "created_at": "2026-07-26T07:04:17Z",
          "last_comment_at": "2026-07-26T07:12:04Z",
          "last_comment_author": "kaveone"
        },
        {
          "number": 3,
          "created_at": "2026-07-30T01:11:38Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/KumihoIO/kumiho-memory",
    "host": "github.com",
    "name": "kumiho-memory",
    "owner": "KumihoIO"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 52,
      "inputs": {
        "security": 45,
        "vitality": 70,
        "community": 24,
        "governance": 46,
        "engineering": 71
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 70,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 60,
            "inputs": {
              "commits_last_year": 171,
              "human_commit_share": 1,
              "days_since_last_push": 0,
              "active_weeks_last_year": 9
            },
            "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": "9/52 weeks with commits",
                "points": 6.2,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 9
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "171 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 171
                    }
                  }
                ],
                "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": "good",
            "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": 84,
            "inputs": {
              "releases_count": 1,
              "latest_release_tag": "v1.0.0",
              "releases_from_tags": false,
              "days_since_latest_release": 7,
              "mean_days_between_releases": null
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "1 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 7 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 7
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "cadence unknown (single release)",
                "points": 12.6,
                "status": "partial",
                "details": [
                  {
                    "code": "release_cadence_unknown",
                    "params": {}
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "critical",
        "name": "Community & Adoption",
        "value": 24,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "critical",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 1,
            "inputs": {
              "forks": 0,
              "stars": 0,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "0 stars",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "0 forks",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "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
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "at_risk",
        "name": "Sustainability & Governance",
        "value": 46,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 15,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.994
            },
            "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 99% of commits",
                "points": 0.1,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 99
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "2 contributors",
                "points": 2.7,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "at_risk",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 38,
            "inputs": {
              "merged_prs": 1,
              "open_issues": 2,
              "closed_issues": 0,
              "issue_closed_ratio": 0,
              "closed_unmerged_prs": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "0% of issues closed",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 0
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "1/1 decided PRs merged",
                "points": 38.2,
                "status": "met",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 1,
                      "decided": 1
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/28 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 46,
            "inputs": {
              "followers": 6,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "KumihoIO",
              "public_repos": 16,
              "account_age_days": 148
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "6 followers of KumihoIO",
                "points": 6.1,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 6,
                      "login": "KumihoIO"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "16 public repos, account ~0 yr old",
                "points": 9.8,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 16
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "kumiho-memory"
              ],
              "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": "65 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 65
                    }
                  }
                ],
                "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": 71,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "moderate",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 68,
            "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": "2 workflow(s)",
                "points": 24,
                "status": "met",
                "details": [
                  {
                    "code": "ci_workflows",
                    "params": {
                      "count": 2
                    }
                  }
                ],
                "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": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "at_risk",
        "name": "Security",
        "value": 45,
        "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": 45,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.5
            },
            "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": "1 out of 1 merged PRs checked by a CI test -- score normalized to 10",
                "points": 2.5,
                "status": "met",
                "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/28 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 not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "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 1",
                "points": 0.5,
                "status": "partial",
                "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": "GitHub workflow tokens follow principle of least privilege",
                "points": 7.5,
                "status": "met",
                "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": 1
            },
            "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": "at_risk",
        "name": "AI Readiness",
        "value": 38,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 1,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "at_risk",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 33,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [],
              "agent_commit_share": 0.91,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "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": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "91 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 91,
                      "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 1",
                "points": 1,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "at_risk",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 49,
            "inputs": {
              "primary_language": "Python",
              "largest_source_bytes": 159367,
              "source_files_sampled": 87,
              "oversized_source_files": 10
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "Python without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "Python"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "10/87 source files over 60KB",
                "points": 48.7,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 87,
                      "oversized": 10
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          }
        ],
        "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": [
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index pypi:kumiho-memory@1.1.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-30T01:18:42.540438Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/KumihoIO/kumiho-memory.svg",
  "full_name": "KumihoIO/kumiho-memory",
  "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.