Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-30 01:18 UTC

KumihoIO / kumiho-memory

Universal memory provider for AI agents (Redis + Kumiho)

PythonMIT★ 0 stars⑂ 0 forkssince Jul 2026View on GitHub ↗

KumihoIO/kumiho-memory holds a health index of 52 out of 100, placing it in the Moderate band. It scores highest on Engineering Quality (71/100) and lowest on Community & Adoption (24/100). It was last updated today. A single contributor accounts for most of its recent work.

52
overall / 100
Moderate

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At risk ceiling of 49. AI Readiness sits outside the overall score.

52
Excellent85-100Exemplary; meets essentially all checked criteria
Good70-84Healthy; minor gaps
Moderate50-69Acceptable with notable gaps; review recommended
At risk30-49Significant weaknesses; adoption warrants caution
Critical1-29Severe problems (abandoned, single-maintainer, no hygiene)
VitalityCommunity &AdoptionSustainability &GovernanceEngineeringQualitySecurityAI Readiness

Score profile

Each axis is a category. The shape matters more than the average — a healthy subject fills the whole shape, while a spike-and-crater profile means strength in one dimension is masking risk in another.

Ownership

Kumiho.ioOrganization
6 followers16 public repossince Mar 2026

This repository is backed by an organization — shared, accountable stewardship that can outlive any single maintainer.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
PyPIkumiho-memory1.1.0-650 days agokumihomemoryai-agentsrediscognitive-memorysummarizationconversational-aimcp

Metrics by category

Vitality

Is the project alive — is code being written and are releases shipping?

70Good · 22% of overall
How it's scored
36/36Push recency — last push 0 days ago
6.2/36Commit cadence — 9/52 weeks with commits
18/18Commit volume — 171 commits in the last year
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Inputs used
commits_last_year171
human_commit_share1
days_since_last_push0
active_weeks_last_year9
How it's scored
27/27Ships releases — 1 releases published
36/36Release recency — latest release 7 days ago
12.6/27Release cadence — cadence unknown (single release)
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count1
latest_release_tagv1.0.0
releases_from_tagsno
days_since_latest_release7
mean_days_between_releases
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.

Community & Adoption

Does the project have users, downloads, attention, and a welcoming setup for contributors?

24Critical · 18% of overall
How it's scored
0/60Stars — 0 stars
0/25Forks — 0 forks
0/15Watchers — 0 watchers
Inputs used
forks0
stars0
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno

Sustainability & Governance

Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?

46At risk · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0.1/22.5Commit distribution — top contributor authored 99% of commits
2.7/13.5Contributor breadth — 2 contributors
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Inputs used
bus_factor1
contributors_sampled2
top_contributor_share0.994
How it's scored
0/46.8Issue resolution — 0% of issues closed
38.2/38.3PR acceptance — 1/1 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/28 approved changesets -- score normalized to 0
Inputs used
merged_prs1
open_issues2
closed_issues0
issue_closed_ratio0
closed_unmerged_prs0
How it's scored
30/30Ownership backing — organization-owned
0/20Verified domain
6.1/25Owner reach — 6 followers of KumihoIO
9.8/25Track record — 16 public repos, account ~0 yr old
Inputs used
followers6
owner_typeOrganization
is_verified
owner_loginKumihoIO
public_repos16
account_age_days148
How it's scored
25/25Published & resolvable — 1 package(s) on pypi
35/35Publish recency — latest publish 0 days ago
20/20Version history — 65 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packageskumiho-memory
ecosystemspypi
any_deprecatedno
min_days_since_publish0

Engineering Quality

Are baseline engineering and documentation practices in place?

71Good · 20% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
0/16Linter config
0/9.6Pre-commit hooks
0/6.4.editorconfig
20/20OpenSSF Scorecard: CI-Tests — 1 out of 1 merged PRs checked by a CI test -- score normalized to 10
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configno
has_precommit_configno
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

Are visible security and supply-chain practices strong, without unresolved high-risk jurisdiction exposure?

45At risk · 16% of overall
How it's scored
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.5License — 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 — no data
7.5/7.5Token-Permissions — GitHub workflow tokens follow principle of least privilege
7.5/7.5Vulnerabilities — 0 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.5
Excluded from scoring (no data or not applicable): signed_releases. Remaining weights renormalized.

AI Readiness

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.

38At risk · 0% of overall
How it's scored
0/45Agent instructions — no CLAUDE.md / AGENTS.md / editor rules
0/15Machine-readable docs (llms.txt)
40/40Legible commit history — 100 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtno
legible_history_share1
agent_instruction_files
agent_instruction_max_bytes
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
0/11Static type checking
0/10Reproducible environment
10/10Demonstrated agent practice — 91 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
1/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 1
Inputs used
has_nixno
has_testsyes
lockfiles
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configs
agent_commit_share0.91
toolchain_manifests
dependency_bot_commit_share0
How it's scored
0/45Type-checkable code — Python without a type-check config
48.7/55Manageable file sizes — 10/87 source files over 60KB
Inputs used
primary_languagePython
largest_source_bytes159,367
source_files_sampled87
oversized_source_files10

Key facts

0GitHub stars
2contributors
171commits, last 12 months
0days since last push
1releases
1bus factor
2open issues
PyPIpackage ecosystems

Data collection 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

More detail

OpenSSF Scorecard 4.5 / 10
4.5aggregate

Independent, tool-agnostic security assessment from the open-source OpenSSF Scorecard. Each check rewards a security practice, not a specific vendor's tool. Checks Scorecard could not determine are marked n/a and excluded from the security score (never counted as zero).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/aSigned-Releasesno releases found
10Token-PermissionsGitHub workflow tokens follow principle of least privilege
10Vulnerabilities0 existing vulnerabilities detected
Direct dependencies 3
RegistryPackageVersion constraintManifest
PyPIkumiho>=0.10.7pyproject.toml
PyPIredis>=5.0.0pyproject.toml
PyPIrequests>=2.31.0pyproject.toml
All dependencies not collected

The resolved dependency set could not be collected for this report: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Raw JSON report machine-readable
{
  "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"
}

Scores are signals, not warranties. They reflect publicly visible practices on GitHub — not a code audit, and not a security guarantee.

Missing data is excluded and weights renormalized, never scored as zero. Methodology is versioned and open: metrics v1.13.0, schema v0.27.0 — full methodology · metrics wiki.

How one result sits in the wider record: aggregate statisticsPyPI.