Public record
Software health reportschema 0.27.0 · metrics 1.13.0 · 2026-07-24 04:49 UTC

kitfunso / hippo-memory

Biologically-inspired memory for AI agents. Decay, retrieval strengthening, consolidation. Zero dependencies.

TypeScript · JavaScriptMIT★ 717 stars⑂ 37 forkssince Mar 2026View on GitHub ↗

kitfunso/hippo-memory holds a health index of 67 out of 100, placing it in the Moderate band. It scores highest on Vitality (86/100) and lowest on Security (50/100). It was last updated 5 days ago. A single contributor accounts for most of its recent work.

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

67
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

Keith SoPersonal account
17 followers35 public repossince Jul 2020

This repository is owned by a personal account. A single-owner project carries more continuity risk than an organization-backed one.

Package ecosystems

RegistryPackageVersionDownloads / moVersionsLast publishTags
npmhippo-memory1.27.03,7661415 days agomemoryaiagentsllmclaudecontextrecallepisodicsemanticembeddingshybrid-search
PyPIhippo-memory-sdk0.3.083555 days agomemoryai-agentsraghippo-memory

Metrics by category

Vitality

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

86Excellent · 22% of overall
How it's scored
36/36Push recency — last push 5 days ago
11.8/36Commit cadence — 17/52 weeks with commits
18/18Commit volume — 656 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year656
human_commit_share1
days_since_last_push5
active_weeks_last_year17

Release discipline

100Excellent
How it's scored
27/27Ships releases — 100 releases published
36/36Release recency — latest release 5 days ago
27/27Release cadence — a release every ~4.4 days
0/10OpenSSF Scorecard: Signed-Releases — no data
Inputs used
releases_count100
latest_release_tagv1.27.0
releases_from_tagsno
days_since_latest_release5
mean_days_between_releases4.4
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?

56Moderate · 18% of overall
How it's scored
46.3/60Stars — 717 stars
13/25Forks — 37 forks
0/15Watchers — 1 watchers
Inputs used
forks37
stars717
watchers1
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
How it's scored
47.8/80Monthly downloads — 3,849 downloads/month across npm, pypi
0/20Registry dependents — not reported by this ecosystem
Inputs used
packageshippo-memory, hippo-memory-sdk
dependents
ecosystemsnpm, pypi
total_downloads
monthly_downloads3,849
Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.

Sustainability & Governance

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

59Moderate · 24% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
10/22.5Commit distribution — top contributor authored 56% 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.555
How it's scored
40.1/46.8Issue resolution — 86% of issues closed
33.3/38.3PR acceptance — 102/117 decided PRs merged
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs102
open_issues1
closed_issues6
issue_closed_ratio0.857
closed_unmerged_prs15
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
9/25Owner reach — 17 followers of kitfunso
23.3/25Track record — 35 public repos, account ~6 yr old
Inputs used
followers17
owner_typeUser
is_verified
owner_loginkitfunso
public_repos35
account_age_days2,193
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.
How it's scored
25/25Published & resolvable — 2 package(s) on npm, pypi
35/35Publish recency — latest publish 5 days ago
20/20Version history — 141 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packageshippo-memory, hippo-memory-sdk
ecosystemsnpm, pypi
any_deprecatedno
min_days_since_publish5

Engineering Quality

Are baseline engineering and documentation practices in place?

77Good · 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 — 24 out of 24 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

Documentation

90Excellent
How it's scored
30/30README
25/25Documentation directory
15/15Documentation / homepage site — https://hippo-memory.com
10/10Repository description
0/10Topics
10/10Wiki
Inputs used
topics
has_wikiyes
homepagehttps://hippo-memory.com
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

50Moderate · 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 — 24 out of 24 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/30 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
7.5/7.5Maintained — 30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
1/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
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
0/7.5Vulnerabilities — 38 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.
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
3.5/25Indirect dependencies free of known advisories — 4 affected: protobufjs 6.11.6 (critical 9.8), adm-zip 0.5.18 (high 7.5), sharp 0.32.6 (high 7.3), +1 more
32.1/40No advisories left outstanding — 1 advisory-carrying package(s) unaddressed past 90 days; oldest published 98 days ago
Inputs used
sourceosv
advisories14
affected_packages4
assessed_packages139
unassessed_packages0
affected_by_severitycritical 1, high 3
direct_affected_packages0
Matched the npm:hippo-memory@1.27.0 runtime dependency closure — what installing the published package pulls in — 139 packages. Reachability is not analyzed.

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.

73Good · 0% of overall
How it's scored
45/45Agent instructions — AGENTS.md
15/15Machine-readable docs (llms.txt) — llms.txt present
40/40Legible commit history — 100 of 100 human commits state their intent (structured subject or explanatory body)
Inputs used
has_llms_txtyes
legible_history_share1
agent_instruction_filesAGENTS.md
agent_instruction_max_bytes1,782
How it's scored
0/18One-command bootstrap
22/22Automated tests
0/11Lint / format config
11/11Static type checking — python/src/hippo_memory/py.typed, tsconfig.json, ui/tsconfig.json, website/tsconfig.json
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 88 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
2/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 2
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json, uv.lock
has_dockerfileno
typed_languageyes
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configspython/src/hippo_memory/py.typed, tsconfig.json, ui/tsconfig.json, website/tsconfig.json
agent_commit_share0.88
toolchain_manifests
dependency_bot_commit_share0
How it's scored
45/45Type-checkable code — TypeScript (statically typed)
54.6/55Manageable file sizes — 5/631 source files over 60KB
Inputs used
primary_languageTypeScript
largest_source_bytes352,615
source_files_sampled631
oversized_source_files5
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
0/20MCP server
40/40Runnable examples — examples
Inputs used
example_dirsexamples
has_mcp_signalno
api_schema_files

Key facts

717GitHub stars
2contributors
656commits, last 12 months
5days since last push
100releases
1bus factor
1open issues
npm, PyPIpackage ecosystems

Data collection warnings

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

More detail

Star and fork history 0 ★ / 37 ⇿
0Stars
37Forks
91Releases

When each star and fork was added, collected from GitHub and bucketed by day. Cumulative growth sits directly above the daily additions it is made of, so the two read against each other: steady organic accretion looks nothing like an abrupt, short-lived burst. Where that difference is measurable, it is reported as growth authenticity.

01325383792026-032026-052026-07
Major 1Minor 36Patch 52
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-24 04:49 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
10CI-Tests24 out of 24 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/30 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
10Maintained30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
2Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 2
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
0Vulnerabilities38 existing vulnerabilities detected
Direct dependencies 16
RegistryPackageVersion constraintManifest
PyPIhttpx>=0.27python/pyproject.toml
PyPIpydantic>=2.0python/pyproject.toml
npm@types/three^0.184.0ui/package.json
npmd3-force^3.0.0ui/package.json
npmreact^19.0.0ui/package.json
npmreact-dom^19.0.0ui/package.json
npmthree^0.184.0ui/package.json
npm@astrojs/preact^5.1.4website/package.json
npm@astrojs/sitemap^3.7.3website/package.json
npm@fontsource-variable/bricolage-grotesque^5.2.10website/package.json
npm@fontsource-variable/hanken-grotesk^5.2.8website/package.json
npm@fontsource-variable/jetbrains-mono^5.2.8website/package.json
npm@tailwindcss/vite^4.3.0website/package.json
npmastro^6.4.2website/package.json
npmpreact^10.29.2website/package.json
npmtailwindcss^4.3.0website/package.json
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

Dependency advisories 4

Installing npm:hippo-memory@1.27.0 pulls in 139 packages, direct and transitive: 4 carry known advisories, of which 0 are direct dependencies.

PackageVersionRelationSeverityAdvisoriesFixed in
protobufjs6.11.6indirectcritical118.6.0
adm-zip0.5.18indirecthigh10.6.0
sharp0.32.6indirecthigh10.35.0
sharp0.34.5indirecthigh10.35.0

An advisory means the version recorded in the dependency graph falls inside an advisory’s affected range. Reachability is not analysed, and the graph includes development and test pins — a finding may concern tooling rather than shipped software.

Raw JSON report machine-readable
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 6834,
      "has_wiki": true,
      "homepage": "https://hippo-memory.com",
      "languages": {
        "CSS": 10817,
        "HTML": 603058,
        "Astro": 75972,
        "Shell": 8743,
        "Python": 436729,
        "JavaScript": 773555,
        "PowerShell": 499,
        "TypeScript": 4138449
      },
      "pushed_at": "2026-07-18T18:49:21Z",
      "created_at": "2026-03-15T10:40:26Z",
      "owner_type": "User",
      "updated_at": "2026-07-22T20:34:09Z",
      "description": "Biologically-inspired memory for AI agents. Decay, retrieval strengthening, consolidation. Zero dependencies.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "master",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript",
        "JavaScript"
      ]
    },
    "owner": {
      "blog": "quanta-mental.com",
      "name": "Keith So",
      "type": "User",
      "login": "kitfunso",
      "company": null,
      "location": "London",
      "followers": 17,
      "avatar_url": "https://avatars.githubusercontent.com/u/68618199?v=4",
      "created_at": "2020-07-21T21:35:58Z",
      "is_verified": null,
      "public_repos": 35,
      "account_age_days": 2193
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v1.27.0",
          "kind": "minor",
          "published_at": "2026-07-18T18:49:21Z"
        },
        {
          "tag": "v1.26.4",
          "kind": "patch",
          "published_at": "2026-07-18T16:31:06Z"
        },
        {
          "tag": "v1.26.3",
          "kind": "patch",
          "published_at": "2026-07-18T09:48:53Z"
        },
        {
          "tag": "v1.26.2",
          "kind": "patch",
          "published_at": "2026-07-16T20:17:54Z"
        },
        {
          "tag": "v1.26.1",
          "kind": "patch",
          "published_at": "2026-07-11T12:32:22Z"
        },
        {
          "tag": "v1.26.0",
          "kind": "minor",
          "published_at": "2026-07-10T06:33:21Z"
        },
        {
          "tag": "v1.25.0",
          "kind": "minor",
          "published_at": "2026-07-05T08:32:20Z"
        },
        {
          "tag": "v1.24.1",
          "kind": "patch",
          "published_at": "2026-07-02T20:54:02Z"
        },
        {
          "tag": "v1.24.0",
          "kind": "minor",
          "published_at": "2026-07-02T06:37:05Z"
        },
        {
          "tag": "v1.23.0",
          "kind": "minor",
          "published_at": "2026-06-08T19:30:58Z"
        },
        {
          "tag": "v1.22.0",
          "kind": "minor",
          "published_at": "2026-06-03T18:20:55Z"
        },
        {
          "tag": "v1.21.0",
          "kind": "minor",
          "published_at": "2026-06-03T08:32:21Z"
        },
        {
          "tag": "v1.20.0",
          "kind": "minor",
          "published_at": "2026-06-02T21:00:45Z"
        },
        {
          "tag": "v1.19.0",
          "kind": "minor",
          "published_at": "2026-06-02T18:42:19Z"
        },
        {
          "tag": "v1.18.0",
          "kind": "minor",
          "published_at": "2026-06-02T17:08:44Z"
        },
        {
          "tag": "v1.17.0",
          "kind": "minor",
          "published_at": "2026-06-02T14:33:58Z"
        },
        {
          "tag": "v1.16.0",
          "kind": "minor",
          "published_at": "2026-06-02T13:36:14Z"
        },
        {
          "tag": "v1.14.0",
          "kind": "minor",
          "published_at": "2026-05-28T14:57:59Z"
        },
        {
          "tag": "v1.13.5",
          "kind": "patch",
          "published_at": "2026-05-27T17:07:17Z"
        },
        {
          "tag": "v1.13.4",
          "kind": "patch",
          "published_at": "2026-05-27T14:24:36Z"
        },
        {
          "tag": "v1.13.3",
          "kind": "patch",
          "published_at": "2026-05-27T14:09:33Z"
        },
        {
          "tag": "v1.13.2",
          "kind": "patch",
          "published_at": "2026-05-27T12:27:47Z"
        },
        {
          "tag": "v1.13.1",
          "kind": "patch",
          "published_at": "2026-05-26T21:29:14Z"
        },
        {
          "tag": "v1.13.0",
          "kind": "minor",
          "published_at": "2026-05-26T16:15:38Z"
        },
        {
          "tag": "v1.12.11",
          "kind": "patch",
          "published_at": "2026-05-25T16:46:27Z"
        },
        {
          "tag": "v1.12.10",
          "kind": "patch",
          "published_at": "2026-05-24T14:25:51Z"
        },
        {
          "tag": "v1.12.9",
          "kind": "patch",
          "published_at": "2026-05-24T14:05:34Z"
        },
        {
          "tag": "v1.12.8",
          "kind": "patch",
          "published_at": "2026-05-24T13:44:44Z"
        },
        {
          "tag": "v1.12.7",
          "kind": "patch",
          "published_at": "2026-05-24T13:29:40Z"
        },
        {
          "tag": "v1.12.6",
          "kind": "patch",
          "published_at": "2026-05-24T12:23:02Z"
        },
        {
          "tag": "v1.12.5",
          "kind": "patch",
          "published_at": "2026-05-24T11:40:45Z"
        },
        {
          "tag": "python-v0.2.0",
          "kind": "other",
          "published_at": "2026-05-24T10:39:13Z"
        },
        {
          "tag": "v1.12.4",
          "kind": "patch",
          "published_at": "2026-05-24T10:14:10Z"
        },
        {
          "tag": "v1.12.3",
          "kind": "patch",
          "published_at": "2026-05-24T10:06:50Z"
        },
        {
          "tag": "v1.12.2",
          "kind": "patch",
          "published_at": "2026-05-24T09:55:23Z"
        },
        {
          "tag": "v1.12.1",
          "kind": "patch",
          "published_at": "2026-05-24T09:49:00Z"
        },
        {
          "tag": "v1.12.0",
          "kind": "minor",
          "published_at": "2026-05-23T23:05:53Z"
        },
        {
          "tag": "v1.11.5",
          "kind": "patch",
          "published_at": "2026-05-23T21:06:19Z"
        },
        {
          "tag": "python-v0.1.0",
          "kind": "other",
          "published_at": "2026-05-23T19:37:14Z"
        },
        {
          "tag": "v1.11.4",
          "kind": "patch",
          "published_at": "2026-05-23T18:23:53Z"
        },
        {
          "tag": "v1.11.3",
          "kind": "patch",
          "published_at": "2026-05-23T17:33:17Z"
        },
        {
          "tag": "v1.11.2",
          "kind": "patch",
          "published_at": "2026-05-23T13:51:09Z"
        },
        {
          "tag": "v1.11.1",
          "kind": "patch",
          "published_at": "2026-05-23T07:33:49Z"
        },
        {
          "tag": "v1.11.0",
          "kind": "minor",
          "published_at": "2026-05-22T20:29:04Z"
        },
        {
          "tag": "v1.10.1",
          "kind": "patch",
          "published_at": "2026-05-22T08:30:29Z"
        },
        {
          "tag": "v1.10.0",
          "kind": "minor",
          "published_at": "2026-05-21T21:51:21Z"
        },
        {
          "tag": "v1.8.1",
          "kind": "patch",
          "published_at": "2026-05-09T20:58:55Z"
        },
        {
          "tag": "v1.8.0",
          "kind": "minor",
          "published_at": "2026-05-09T16:45:59Z"
        },
        {
          "tag": "v1.7.9",
          "kind": "patch",
          "published_at": "2026-05-09T14:27:13Z"
        },
        {
          "tag": "v1.7.8",
          "kind": "patch",
          "published_at": "2026-05-09T08:54:43Z"
        },
        {
          "tag": "v1.7.7",
          "kind": "patch",
          "published_at": "2026-05-09T08:10:05Z"
        },
        {
          "tag": "v1.7.6",
          "kind": "patch",
          "published_at": "2026-05-09T06:37:37Z"
        },
        {
          "tag": "v1.7.5",
          "kind": "patch",
          "published_at": "2026-05-07T12:27:55Z"
        },
        {
          "tag": "v1.7.4",
          "kind": "patch",
          "published_at": "2026-05-07T10:30:26Z"
        },
        {
          "tag": "v1.7.3",
          "kind": "patch",
          "published_at": "2026-05-07T07:45:27Z"
        },
        {
          "tag": "v1.7.2",
          "kind": "patch",
          "published_at": "2026-05-06T16:26:33Z"
        },
        {
          "tag": "v1.7.1",
          "kind": "patch",
          "published_at": "2026-05-06T16:26:23Z"
        },
        {
          "tag": "v1.7.0",
          "kind": "minor",
          "published_at": "2026-05-06T16:26:15Z"
        },
        {
          "tag": "v1.6.5",
          "kind": "patch",
          "published_at": "2026-05-06T16:26:01Z"
        },
        {
          "tag": "v1.6.4",
          "kind": "patch",
          "published_at": "2026-05-05T22:03:51Z"
        },
        {
          "tag": "v1.6.3",
          "kind": "patch",
          "published_at": "2026-05-05T21:31:25Z"
        },
        {
          "tag": "v1.6.2",
          "kind": "patch",
          "published_at": "2026-05-05T15:17:45Z"
        },
        {
          "tag": "v1.6.1",
          "kind": "patch",
          "published_at": "2026-05-05T14:49:05Z"
        },
        {
          "tag": "v1.6.0",
          "kind": "minor",
          "published_at": "2026-05-05T14:31:48Z"
        },
        {
          "tag": "v1.5.2",
          "kind": "patch",
          "published_at": "2026-05-05T14:16:57Z"
        },
        {
          "tag": "v1.5.1",
          "kind": "patch",
          "published_at": "2026-05-05T14:02:45Z"
        },
        {
          "tag": "v1.5.0",
          "kind": "minor",
          "published_at": "2026-05-05T12:55:52Z"
        },
        {
          "tag": "v1.4.0",
          "kind": "minor",
          "published_at": "2026-05-05T10:10:45Z"
        },
        {
          "tag": "v1.3.2",
          "kind": "patch",
          "published_at": "2026-05-04T15:54:59Z"
        },
        {
          "tag": "v1.3.1",
          "kind": "patch",
          "published_at": "2026-05-04T15:26:55Z"
        },
        {
          "tag": "v1.3.0",
          "kind": "minor",
          "published_at": "2026-05-04T14:08:35Z"
        },
        {
          "tag": "v1.2.1",
          "kind": "patch",
          "published_at": "2026-05-04T12:44:43Z"
        },
        {
          "tag": "v1.2.0",
          "kind": "minor",
          "published_at": "2026-05-03T22:31:57Z"
        },
        {
          "tag": "v1.1.0",
          "kind": "minor",
          "published_at": "2026-05-03T21:13:48Z"
        },
        {
          "tag": "v1.0.0",
          "kind": "major",
          "published_at": "2026-05-03T12:18:38Z"
        },
        {
          "tag": "v0.36.0",
          "kind": "minor",
          "published_at": "2026-04-29T18:11:03Z"
        },
        {
          "tag": "v0.35.0",
          "kind": "minor",
          "published_at": "2026-04-29T13:26:10Z"
        },
        {
          "tag": "v0.34.0",
          "kind": "minor",
          "published_at": "2026-04-29T11:16:51Z"
        },
        {
          "tag": "v0.33.0",
          "kind": "minor",
          "published_at": "2026-04-29T11:17:09Z"
        },
        {
          "tag": "v0.32.0",
          "kind": "minor",
          "published_at": "2026-04-29T11:17:10Z"
        },
        {
          "tag": "v0.31.0",
          "kind": "minor",
          "published_at": "2026-04-22T11:38:01Z"
        },
        {
          "tag": "v0.30.1",
          "kind": "patch",
          "published_at": "2026-04-22T07:53:01Z"
        },
        {
          "tag": "v0.30.0",
          "kind": "minor",
          "published_at": "2026-04-22T07:52:46Z"
        },
        {
          "tag": "v0.24.2",
          "kind": "patch",
          "published_at": "2026-04-16T08:54:37Z"
        },
        {
          "tag": "v0.24.1",
          "kind": "patch",
          "published_at": "2026-04-15T22:52:12Z"
        },
        {
          "tag": "v0.24.0",
          "kind": "minor",
          "published_at": "2026-04-15T22:56:00Z"
        },
        {
          "tag": "v0.23.0",
          "kind": "minor",
          "published_at": "2026-04-15T22:55:59Z"
        },
        {
          "tag": "v0.22.1",
          "kind": "patch",
          "published_at": "2026-04-15T22:55:58Z"
        },
        {
          "tag": "v0.22.0",
          "kind": "minor",
          "published_at": "2026-04-15T22:55:58Z"
        },
        {
          "tag": "v0.21.1",
          "kind": "patch",
          "published_at": "2026-04-15T22:55:57Z"
        },
        {
          "tag": "v0.21.0",
          "kind": "minor",
          "published_at": "2026-04-15T22:55:56Z"
        },
        {
          "tag": "v0.20.3",
          "kind": "patch",
          "published_at": "2026-04-15T22:55:55Z"
        },
        {
          "tag": "v0.20.2",
          "kind": "patch",
          "published_at": "2026-04-15T22:55:54Z"
        },
        {
          "tag": "v0.20.1",
          "kind": "patch",
          "published_at": "2026-04-12T11:12:13Z"
        },
        {
          "tag": "v0.20.0",
          "kind": "minor",
          "published_at": "2026-04-12T10:53:35Z"
        },
        {
          "tag": "v0.19.1",
          "kind": "patch",
          "published_at": "2026-04-09T22:52:47Z"
        },
        {
          "tag": "v0.19.0",
          "kind": "minor",
          "published_at": "2026-04-08T19:23:21Z"
        },
        {
          "tag": "v0.18.0",
          "kind": "minor",
          "published_at": "2026-04-08T18:27:26Z"
        },
        {
          "tag": "v0.17.0",
          "kind": "minor",
          "published_at": "2026-04-08T18:12:43Z"
        },
        {
          "tag": "v0.16.2",
          "kind": "patch",
          "published_at": "2026-04-08T17:44:10Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "3dab4b5f4398d99e0404284099b374fda461d470",
          "body": "…(v1.27.0) (#132)\n\nRows entering a store via promote/share/autoShare/sync/import never entered\nthat store's embedding index and scored bm25-only in hybrid recall (measured\n3.15x base deficit vs an identical local twin; 5.4x on the richer S5 probe).\nOne invariant now holds at every producer: single-r\n[…]\n\nGates: plan-eng 61->88, code-review 84, independent 88, codex R1 1xP2\nfixed -> R2 clean. Episode 01KXV39T951THW81ZSD088FKZX (arm default-opus).\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: embed promoted/shared global-store rows + hippo embed --global …",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-18T18:48:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9634b98db08979533bb680998f0df139975bd829",
          "body": "…) (#131)\n\n* fix: normalize path-locality boost by the more specific side (S5)\n\npathOverlapScore divided by the memory's own path-tag count, so a memory\nwith one generic tag (path:<user> at home root) scored 1.0 from every cwd\nunder home and took the full 1.3x recall boost cross-project via the\nglob\n[…]\neen, build:all green.\n\nEpisode 01KXTBPRV5R3KJVTPMPPG9M8TT (dev-framework-rl).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: normalize path-locality boost by the more specific side (v1.26.4…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-18T16:29:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "564c97191da113d6c456c605a7bf4b582bfcbf4e",
          "body": "* fix: deterministic dedupe survivor selection\n\ndeduplicateStore's survivor sort tied exactly on fresh near-duplicates\n(strength 1 vs 1, retrieval_count 0 vs 0; measured pre-fix) and the 0.01\nabs-diff epsilon made the comparator non-transitive, so which content\nsurvived hippo sleep fell to arrival o\n[…]\n-rl).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B36qQR2yRhDr564J4KxMzB\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: deterministic dedupe survivor selection (v1.26.3) (#130)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-18T09:47:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fcca2d675cc8d8b2ae3fcc421a8424f47057a981",
          "body": "* fix: global --scope guard + server keep-alive hardening (v1.26.2 candidate)\n\nTwo pre-vetted v1.25.0 review advisories, hardened at root:\n\n1. Value-less --scope: parseArgs stores it as boolean true; 14 consumer\n   sites across 7 commands then either coerced it to the literal scope\n   string 'true' \n[…]\ndum.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\nClaude-Session: https://claude.ai/code/session_01B36qQR2yRhDr564J4KxMzB\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: global --scope guard + server keep-alive hardening (v1.26.2) (#129)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-16T20:16:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6df61a3cf6331b2debe14a201b4bef5aaa9b1049",
          "body": "* fix: apply recall scope rule to graph-hop expansion (v1.26.1 candidate)\n\ngraphExpandRecall (cli --hops; public index.ts export) loaded graph-reached\nmemories by id, re-applying superseded/asOf filters but NOT the v39 recall\nscope rule, so a private-scoped or quarantine-scoped memory reached throug\n[…]\nhold.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\nClaude-Session: https://claude.ai/code/session_01B36qQR2yRhDr564J4KxMzB\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: apply recall scope rule to graph-hop expansion (v1.26.1) (#128)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-11T12:30:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d325cf1b3c858757f0edfc27e3e78bede6263536",
          "body": "Cross-fresh-ingest rank variance (LoCoMo conv-1 x4: stdev 0.0175) had two\ncauses, both fixed:\n\n1. DOMINANT: embedding input text was content + ALL tags, and auto path:*\n   tags embed the store directory path, so every fresh store embedded\n   different text for identical content. embeddingInputText()\n[…]\npendent 88 pass + codex converged to the documented\nlexical residual).\n\n\nClaude-Session: https://claude.ai/code/session_01B36qQR2yRhDr564J4KxMzB\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: deterministic recall across fresh ingests (v1.26.0) (#127)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-10T06:31:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9da6d3f3ecf836374801a82ac0a96d14a54059d5",
          "body": "…ss attribution (#126)\n\n* fix: locomo harness newline truncation (shell=True removed) + published-finding correction\n\n* fix: batch-shim refusal on explicit command= prefixes too (codex P2) + test docstring accuracy\n\n* fix: bare-name batch-shim refusal via which() resolution (codex round 2; empirically CreateProcess does not PATHEXT-resolve .cmd, hardening converts raw FileNotFoundError into the actionable hint)",
          "is_bot": false,
          "headline": "fix: locomo harness newline truncation + correct the published tag-lo…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-05T15:42:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dbb489e838309e7026d15611a33f867c402efbba",
          "body": "* docs: publish LoCoMo v1.25.0 baseline refresh (F7)\n\nEstablishes the publishable deterministic LoCoMo baseline for v1.25.0:\nevidence recall@5 = 0.363369 (score_evidence.py canonical rescore, 1982\nscored QAs), 2.10x the April v0.32.0 baseline (0.172748) under the\nidentical frozen protocol (top-k 5, \n[…]\nds (codex round 2 P2, output-name extension mismatch)\n\n* docs: benchmark-local README banner + plan command fix (codex round 3 P2/P3)\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: publish LoCoMo v1.25.0 baseline refresh (F7) (#124)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-05T12:37:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f20d9e973e6ef47052910575fcabcd93ff664008",
          "body": "* feat: close v39 scope-isolation post-ship tail (CLI recall deny, secretSkipped, surface tests)\n\nCloses TODOS.md \"Memory scope isolation post-ship tail\" items 1-3\n(docs/plans/2026-07-04-scope-isolation-post-ship-tail.md):\n\n1. CLI recall private-scope residue: cmdRecall and cmdExplain now apply the\n\n[…]\n (graph-hop scope parity, concurrency-test flake,\nvalue-less --scope polish).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: scope-isolation post-ship tail (v1.25.0) (#123)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-05T08:31:05Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3418b92eb54c3516df01494840f0e920eaa70d94",
          "body": "…ne-wide scrub)\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: mark secret-audit tail item DONE (v1.24.1 importer veto + machi…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-02T21:04:09Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "076088a6cebc84e26ee69249fc17e93d46307102",
          "body": "learnFromMemoryMd auto-imports ~/.claude/projects/*/memory/*.md on sleep.\nThe v1.24.0 secret hard veto gated share/promote/sync/ambient but missed\nthis ingest path, so a memory file that exists purely to hold a credential\ncould be pulled into the store, mirrored to markdown, and auto-shared to\ngloba\n[…]\nporter now runs detectSecret per file and skips secret-bearing\nones (logged), closing the gap. No schema change; compatible with 1.24.0\nstores.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: gate Claude Code memory importer with secret veto (v1.24.1)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-02T20:53:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "01ae570a402c7a428924914f9a5ac0d7b92c3dbd",
          "body": "Rename CHANGELOG Unreleased section to 1.24.0. Version manifests were\nbumped pre-merge; this cuts the release.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: release v1.24.0 - memory scope isolation",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-02T06:36:15Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5a9ae557e17df11cbb6cbb562a2ba0dc8c8ac4a1",
          "body": "…est fixture\n\nThe fixture used the actual production key value in a PUBLIC repo. Replaced\nwith a synthetic value (sk_vendor_1a2b3c4d) that matches the same detector\npattern. NOTE: the real value is still present in merged public history at\ndc7d3ba - the key MUST be rotated regardless of this scrub.",
          "is_bot": false,
          "headline": "fix(scope-isolation): scrub real 2chain prod key from secret-detect t…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-02T06:26:53Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d65c09479d1b40f3c20530c51ed208565fb6043f",
          "body": "… HIPPO_HOME global-root backfill, bounded filter window\n\nFrom the post-merge adversarial review (fresh-context subagent that\nexecuted the regexes):\n\nP1: the generic secret-assignment pattern flagged ordinary code\nsnippets ('token = estimateTokens(entry.content)') and prose ('the\nsecret: incremental\n[…]\nt-ship tail (recall private-scope residue, SleepResult skip count,\nHTTP/MCP surface tests, global-store secret audit, S5 path tuning).\n\nFull suite 2652 green (known server-concurrency flake excluded).",
          "is_bot": false,
          "headline": "fix(scope-isolation): post-merge /review findings - secret-regex FPs,…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-02T06:23:26Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "dc7d3ba66aacecd1f8e4822c5a351c35a897bcf2",
          "body": "…117)\n\n* feat(scope-isolation): S1 project-identity primitive + plan v2 after codex review\n\nresolveProjectIdentity(cwd): nearest .hippo ancestor, else git root; the\nuser home dir is never a project (its .hippo is the global store); a\nmarkerless dir is user-global (empty name) rather than a fabricate\n[…]\ne; excluded rows\nmatching the query could fill the window before an admitted row loads.\nWith entryFilter set (ambient query mode only, never the per-turn\npinned hook), rank the full match set instead.",
          "is_bot": false,
          "headline": "feat: memory scope isolation (origin partition + secret veto, v39) (#…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-02T05:59:59Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c7c7fdf939bfc2041649229c193f6e26959daec9",
          "body": "… cards (Speculative); bump version lines to 1.23.0\n\nTransplants two items drafted 2026-06-30 on the stale feat/e3-sleep-enqueue-hook\nbranch into the consolidated roadmap:\n\n- Committed: memory scope isolation - stop UserPromptSubmit hook injecting\n  path:skf_s memories (incl. a production API key) i\n[…]\n\n- Speculative: /quiz-me learning-gate cards as first-class hippo memories\n  with spaced-repetition decay.\n\nAlso refreshes the stale \"Current version\" lines (1.22.0 -> 1.23.0, npm\npublish 2026-06-08).",
          "is_bot": false,
          "headline": "docs(roadmap): add memory scope isolation (Committed) + learning-gate…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-07-01T21:01:54Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "498191018739d57062a680ed3fededf19c1aa01c",
          "body": "* feat(eval): E1 longitudinal lifecycle harness (generator + driver + invariants)\n\nThe pre-registered E1 protocol (hippo-paper PREREGISTERED-DESIGN.md v0.2+A1):\n\n- scripts/e1-lifecycle/generate.mjs: deterministic protocol generator\n  (mulberry32; same seed = byte-identical). 300 version-chained fact\n[…]\nact repo per\n  the prereg, not to this code repo.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(eval): E1 longitudinal lifecycle harness (paper protocol) (#115)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-11T20:17:29Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3a65d8da427c97c666d5a60a775d921b02bf3fd0",
          "body": "…mentation) (#114)\n\n* feat(eval): lifecycle ablation flags + injectable clock (paper instrumentation)\n\nEVAL-ONLY env switches for the pre-registered memory-lifecycle experiments\n(hippo-paper prereg-v0.2-frozen): each flag neutralizes exactly one lifecycle\nmechanism so its causal contribution can be \n[…]\n: 2595 passed, 0 failures (known flake excluded).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(eval): lifecycle ablation flags + injectable clock (paper instru…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-11T17:43:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "15a556e0bbea5521575c49859a4e6f942a8da545",
          "body": "* feat(importers): K1 markdown-vault import baseline (--vault)\n\nAdd importVault(): ingest a vault folder of .md notes as kind='raw' memories,\nmirroring the connector pattern (tag provenance source:vault/vault:<name>,\nartifactRef cursor, archiveRaw deletions - never supersede a raw row). Idempotent\no\n[…]\nate:secret` throw; `vault:private:v` is accepted.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(importers): K1 markdown-vault import baseline (--vault) (#112)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-11T13:40:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "45592bb910f3f197a2390f706baab2905ecf545e",
          "body": "…113)\n\nImplements the 2026-06-10 design audit (38 confirmed findings, 7 high)\nplus a scroll-reactive background field. Highlights:\n\n- Fix built CSS losing the standard backdrop-filter property: drop the\n  hand-written -webkit- duplicate so LightningCSS owns prefixing; dist\n  verified to ship both pr\n[…]\nthe approved mockups; build green\nincluding readme-sync; no horizontal overflow at 390px; DESIGN.md added\nas the website design source of truth.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(website): design-audit rebuild, 38 fixes + synapse background (#…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-10T19:19:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "87746f3d48db1a6b652dad6f85a81bd0316798b5",
          "body": "…strength field (#111)\n\nThe merge pass wrote `strength: e.strength * 0.3` to source episodics, but\ncalculateStrength() recomputes live strength from last_retrieved/half_life\nand never reads the stored field, so the demotion was inert for ranking and\nphysics mass. It was also transient: the next slee\n[…]\nassertion). Full suite 2535 passed; the single\nserver-concurrency ECONNRESET failure is load-flake, passes in isolation,\nuntouched by this diff.\n\nCo-authored-by: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(consolidate): demote merged sources via half_life, not the inert …",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-10T10:35:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a36238abbd1141657d13f736909458ab505c8f5b",
          "body": "…dology (#110)\n\nThe DAG consolidation hierarchy first slice was built and measured on the\nlifecycle stress eval. The budget-win hypothesis is FALSIFIED: summary->children\nsubstitution regresses budget-bounded QA -6.3pp under a binding budget (a\ncompressed summary retrieves worse than the raw child i\n[…]\nplementation is archived\non branch feat/dag-consolidation-slice1. This lands only the finding plus the\npre-registered methodology.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(eval): DAG consolidation slice 1 - measured-false result + metho…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-10T09:45:04Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5fafae4e54764d754a2a623edbc84bfbc419c95a",
          "body": "…st-null finding (#108)\n\nAdds the lifecycle stress eval (the roadmap keystone gating the DAG feature): a held-out injector, a hermetic + deterministic harness, a pre-registered methodology, and the first reproducible local result.\n\nResult is an HONEST NULL. Under a fixed active-context budget at 1x/\n[…]\nl: plan-eng 3 rounds + codex 3 rounds; code-review pass; review pass (independent 92 + codex). 9/9 tests, deterministic, hermetic.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(eval): lifecycle stress eval first slice - reusable ruler + hone…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-09T20:34:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c3c5b319ebd4e8cda0d881391ea8a7cacea4b53",
          "body": "hippo-memory.com is attached to the Cloudflare Pages project and live with SSL. Migrate every canonical reference from the pages.dev subdomain to the apex:\n\n- astro.config site -> hippo-memory.com (drives canonical, OG, and the sitemap)\n- robots.txt sitemap URL + header comment\n- package.json homepa\n[…]\nyment; canonical tags consolidate it to the apex. IndexNow re-submitted for the new host (202); GitHub repo website field updated.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(website): point canonical domain at hippo-memory.com (#107)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-09T15:53:19Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d66ea76523f5f206bd9303156197827e3e73dd46",
          "body": "Points the npm package's Homepage link at the landing site (https://hippo-memory.pages.dev), giving the npmjs.com package page a canonical project-site backlink for discovery. Takes effect on the next npm publish. Switch to the custom domain when hippo-memory.com goes live (alongside the astro.config site change).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: add homepage field to package.json (#106)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-09T15:39:50Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "905286608cec298138583462348047ec073f9cd7",
          "body": "…l-first (#105)\n\nHomepage-only meta description + og:description override in index.astro, adding the high-search modifiers 'open-source' and 'local-first'. The canonical site.description (JSON-LD and every other page) and the visible hero copy are unchanged; sub-pages keep their own descriptions (verified /vs/mem0 unaffected).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "seo(website): enrich homepage meta description with open-source, loca…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-09T15:30:18Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "99ac7bd698e15566c883813b42fc89682a633fa3",
          "body": "deploy: pass --project-name hippo-memory --branch main. wrangler 4.x requires the project name (npm run deploy errored without it, hand-worked-around on 3 deploys); --branch main forces the production promotion so a deploy from git branch master cannot silently land as a preview.\n\nIndexNow: add public/<key>.txt so Bing/Yandex accept URL submissions for fast crawl of /benchmarks, /quickstart, /vs/mem0.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(website): fix deploy script, add IndexNow key (#104)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-09T15:21:47Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f07a42a66263c38c7067bd8c3e344bd74c9df2ee",
          "body": "… (#103)\n\nThree indexable content pages (the single landing page ranked for almost nothing):\n\n- /benchmarks: LongMemEval methodology + per-haystack (98.6/99.8) and large-store\n  results, 74%/926/0 receipts, reproduce section. TechArticle JSON-LD.\n- /quickstart: install + per-agent integrations (Clau\n[…]\n matches\nthe existing dark/violet design + plain factual voice. Builds clean (5 pages); the\nREADME<->site drift guard stays green.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(website): SEO/AEO tier 2 - benchmarks, quickstart, vs-mem0 pages…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-09T15:01:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "63b0cf34f71cfd86cbcff02d644704a1d55630ce",
          "body": "…rawler robots (#102)\n\nMachine-facing SEO/AEO improvements for hippo-memory.pages.dev (no visible copy/voice changes):\n\n- Add public/llms.txt: answer-engine summary (what hippo is, key facts, LongMemEval\n  benchmark numbers 98.6/99.8, integrations, links, install). On-brand for a\n  memory-for-AI too\n[…]\n feeds FAQPage schema).\n\nREADME<->site drift guard stays green. Builds clean (404.html + index.html + llms.txt\n+ sitemap in dist).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(website): SEO/AEO tier 1 - llms.txt, enriched JSON-LD, 404, AI-c…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-09T13:27:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5381c7d357ed5ee07e1ed48cf8a0f96c254c1233",
          "body": "* docs: consolidate ROADMAP + ROADMAP-RESEARCH into one; add LongMemEval per-haystack dual numbers\n\nConsolidate the two roadmap documents into a single ROADMAP.md with no content\nremoved (Part I = grant-tied deliverables, Part II = canonical execution roadmap,\nboth preserved verbatim). ROADMAP-RESEA\n[…]\n+ 10 systems match). The site redeploys on merge.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: merge roadmaps + LongMemEval per-haystack dual numbers (#101)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-09T12:30:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fb96f7e207eb9d5d64511e49ca4bb589e306f509",
          "body": "…yage/Cohere) (#100)\n\nAdds config.embeddings.provider so a user can bring a frontier API embedder\n(e.g. text-embedding-3-large) for frontier-class retrieval, while the default\nstays the zero-dependency local @xenova/transformers path (no API keys, no new\nruntime deps; API providers use the native fe\n[…]\nemEval benchmark (dual numbers) is the Workstream C\nfollow-up in docs/FRONTIER_EMBEDDER_BENCHMARK.md (needs API egress and a key).\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: pluggable embedding providers (local default + opt-in OpenAI/Vo…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-08T19:30:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4f8c7cc2c6480036363101af247de64a6ff8bf89",
          "body": "Swap the abstract decay-curve glyph for a recognisable minimal hippo\nhead (ears + brow + broad muzzle) in the violet->cyan brand gradient on\nthe dark rounded square. Keeps the wordmark, sizing, and per-instance\ngradient id. Uses userSpaceOnUse so the gradient stays continuous across\nthe composed shapes.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(website): replace logo glyph with a minimal hippo head (#99)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-08T16:00:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ea5e103478eca940ea7ccb832282ec7b6a5eb435",
          "body": "Replace the static wrapped list with a seamless looping ticker of the\nsupported tools (two duplicated groups, translateX(-50%)). Hover pauses;\nprefers-reduced-motion falls back to the static wrapped list; edge fade\nmask via mask-image. Scoped styles, no JS.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(website): turn \"Works with\" into an infinite marquee (#98)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-08T14:33:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "35dcbe3a39893725bbe10bb5c1df5b8e2200d273",
          "body": "Add a website badge (hippo-memory.pages.dev) to the README badge row so\nthe live site is visible on the repo landing page. The repo About website\nfield was also set to the same URL.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: surface the live site link in README badges + repo About (#97)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-08T14:22:40Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "c273638222b63e60fbb9e2c4913456d525614c1d",
          "body": "Bring ROADMAP.md, ROADMAP-RESEARCH.md, TODOS.md current after the\nE2/E3 graph arc shipped v1.16.0 to v1.22.0:\n- version headers (1.11.4 / 1.15.0) to 1.22.0; python to v0.3.0\n- all eight E2 first-class objects marked shipped (incident, process,\n  policy, skill, project_brief, customer_note all v1.16.\n[…]\n7.2 pipeline unify, A5 v2 sub-2, L2 cartridge spike, K1 importer\n- funding tracker: AI Champions Phase 1 marked Unsuccessful 60.0%\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: refresh roadmap to v1.22.0 (E2/E3 graph track shipped) (#96)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-03T21:03:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "779049821fe97e779be7a2183147d1ad4c22476b",
          "body": "Release of the migration v38 graph provenance fix (PR #95): an in-force E2 object\nstays in the knowledge graph after its mirror memory is forgotten or\nconsolidation-pruned. See CHANGELOG.md for the full notes and the deferred\ntenant-level rebuild-signal follow-up.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump to v1.22.0, update changelog (graph/E2 provenance)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-03T18:19:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3fb58fcaa87229a73b5c132e6ee365e1a08b8b6b",
          "body": "…on v38) (#95)\n\nAn in-force E2 object (decision/policy/customer-note/project-brief) now stays in the\nknowledge graph after its mirror memory is forgotten or consolidation-pruned. Migration\nv38 anchors graph entity/relation provenance to the E2 object (nullable memory_id +\nsource_object_type/id) inst\n[…]\n\nsubsystem and the npm-release episode; both self-heal on the next memory write.\nSee docs/plans/2026-06-03-graph-e2-provenance.md.\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: anchor graph provenance to the authoritative E2 object (migrati…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-03T18:11:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "796350659ec4e47d94bc5c9f0c247426f7d15448",
          "body": "Anchor graph entity/relation provenance to the authoritative E2 object\ninstead of the decaying memory mirror, so an in-force decision/policy/\nnote/brief no longer drops from the knowledge graph when its mirror is\nforgotten or consolidation-pruned. Build deferred until the feat/e3-*\nbranches land on master. Adds the plan doc + a ROADMAP Deferred row.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: scope graph/E2 provenance fix (deferred follow-up)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-03T11:30:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "41ca6bd12e0251face17bb7549bf4fb4b96c7730",
          "body": "* feat: L1 graph-retrieval stream into RRF (hippo recall --graph-stream)\n\nA 3rd RRF fusion input (beside BM25 + dense) that re-ranks in-pool candidates\nby graph proximity to the strong lexical seeds. Reuses the E3.2 traversal;\nopt-in, default-off; byte-identical 2-list path when the graph yields not\n[…]\n update changelog (L1 graph-retrieval RRF stream)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: L1 graph-retrieval stream into RRF (recall --graph-stream) (#94)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-03T08:31:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "20cfcc24ea116f6c13bb89f9eabc5d1109bb8065",
          "body": "…1/graph) (v1.20.0) (#93)\n\nRead-only over the E3 entity/relation graph. New src/graph-view.ts builds a\nGraphModel (loadEntities/loadRelations + focus helpers), lays it out\ndeterministically, and renders a self-contained interactive HTML node-link\ndiagram (offline, no deps; XSS-escaped per context) o\n[…]\n19 real-DB tests. Codex review: 7 rounds, a P1\n+ 8 P2s on the focus/read path caught and fixed.\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: graph observability + visualization (hippo graph show/view + /v…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-02T20:59:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1ee33caba38bc6368f36b8ea7364dff4d384a747",
          "body": "Auto-rebuild the entity/relation graph during `hippo sleep` so recall --hops and\ncross-object `references` edges run on fresh data without a manual\n`hippo graph extract`.\n\nProducer: a fail-soft markGraphDirty on every graph-source E2 mutation\n(save/close of decision/policy/customer_note + save/close\n[…]\necycle. No migration. 16 real-DB tests.\nCodex review (4 rounds): a P1 + 3 P2s caught and fixed.\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: E3 sleep enqueue-hook + atomic graph rebuild (v1.19.0) (#92)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-02T18:41:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5509ea60b0da11b48632540b7350325d353019f8",
          "body": "…ory layer debate (Track L) + A7.2 follow-up\n\nTrack K (Obsidian/Logseq/org-roam/JSON-Canvas connectors, format-not-app), Track L (latent memory as a derived layer not substrate; non-goal #10), and the A7.2 deferred item (unify cli/api/mcp recall re-ranking). codex-reviewed earlier this session.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: roadmap - knowledge-graph PKM connectors (Track K) + latent-mem…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-06-02T17:18:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "845df4e1078661ef3cc29a92a77387fc6fc52048",
          "body": "* feat: A7 recall-trace - explainable lifecycle re-ranking (recall --why + /v1)\n\nOpt-in per-result rerankTrace surfacing the lifecycle re-ranking transforms on recall --why (text+JSON) and /v1 (explain). RerankStep in search.ts (acyclic); SearchResult + RecallResultItem carriers; applyGoalStackBoost\n[…]\n recall-trace)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: A7 recall-trace - explainable lifecycle re-ranking (v1.18.0) (#91)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-02T17:01:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e64a166daa14fcbe0307c957584f943001b92912",
          "body": "…#90)\n\nAdd a Pass 3 to `hippo graph extract` that emits the first cross-object\nrelations beyond `supersedes`: a deterministic name-match heuristic that\nadds a `references` edge when one consolidated object's text contains\nanother extracted entity's name (a decision that mentions a policy by\nname, a \n[…]\nndent-review critics\n+ codex (2 P2s caught and fixed: superseded-row staleness, prefix shadow).\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: E3.1 cross-object references edges (graph extract name-match) (…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-02T14:32:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3c31085e605eaa1e9257acaaf68ebeb8dbb10f47",
          "body": "Traverse the E3 entities/relations graph N hops from the lexical seed\nresults to surface linked memories a query-token search misses. New\nsrc/graph-recall.ts (BFS, seed-inherited scoring, adjacency placement,\nlocal+global stores, full bi-temporal as-of, min-results protection) +\nthree SELECT-only re\n[…]\nia plan-eng/code-review/independent-review\ncritics + two codex rounds (6 P2s caught and fixed).\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: E3.2 multi-hop graph recall (hippo recall --hops N) (#89)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-02T13:30:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a8e173fd8756e4b9173b4866ce67f25a8f6ab855",
          "body": "Wire the public CF Web Analytics beacon token as a committed default (with PUBLIC_CF_BEACON_TOKEN env override). Token is a public site identifier embedded in page HTML by design - grants no account access - so committing keeps analytics on across every pre-built wrangler deploy. Cookie-less.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(website): enable Cloudflare Web Analytics",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-06-02T13:26:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b90a7a6a3023f2e02dac7dd51f2d2b533fda6c69",
          "body": "…d, FAQ)\n\nBuild-time GitHub stars + npm downloads baked static (fallback + cached). Local-first section (0 outbound HTTP receipt, GDPR one-call, tenant isolation). Get-started + zero-config auto-install. 3-store architecture flow in How-it-works. FAQ + FAQPage JSON-LD (native details/summary). Mobil\n[…]\ned Cloudflare Web Analytics. README<->page drift guard wired into build. Lighthouse 99/100/100/100; no mobile overflow at 360/390.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(website): landing page v2 (social proof, local-first, get-starte…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-06-02T11:37:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f6ccd98fd171237a2b8226f3926553aee207a885",
          "body": "Replace the condensed principle-based table with the complete 20-feature x 10-system matrix reproduced verbatim from the README (Hippo, MemPalace, Mem0, Basic Memory, gbrain, Zep, Letta, Cognee, Memoria, EverMind), including the asterisked 'not directly comparable' benchmark caveats + footnotes. Ren\n[…]\n cells (Yes/No/Partial, all AA contrast), Hippo column highlighted, system names link to each project. Lighthouse 100/100/100/100.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(website): add full README comparison matrix to compare section",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-06-02T10:52:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bca65bb2b93b8e9e9b229b0d81c9621e6e4c473b",
          "body": "Eliminate horizontal overflow on the problem-section failure motif (min-w-0 on truncating flex children). Compact the compare table header on mobile (show 'others'; full 'save everything, search later' on sm+). Larger copy-button tap target. Verified: no horizontal scroll at 360/390px, lighthouse mobile 100/100/100/100.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(website): mobile responsive polish",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-06-01T22:00:16Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "0a1499de48d04f691e16c27220b56d478c06d9dd",
          "body": "Dark-premium static marketing page in website/, for Cloudflare Pages. Astro 6 + Tailwind v4 + one Preact island (animated decay curve) + animated terminal. Verified-only claims (74% R@5, 926 tests, 0 runtime deps, MIT); no retracted sequential-learning magnitude. Lighthouse 99/100/100/100 (perf/a11y\n[…]\new 92, codex cross-model review (caught + fixed main->master 404 links, SMIL reduced-motion, untracked lockfile, wrangler devDep).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(website): add hippo-memory landing page (Astro, Cloudflare Pages)",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-06-01T21:40:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c4d88f7d188401a83cc0447f18ad0acc8e8817c5",
          "body": "Populates the E3 graph from the already-structured consolidated E2 objects, with NO\nNLP. `hippo graph extract` is an idempotent rebuild: clear the tenant graph, then\nre-derive one entity per active-or-superseded decision/policy/customer_note/\nproject_brief (-> decision/policy/customer/project entity\n[…]\ny entity name threw after the graph\nwas cleared); fixed at root (trim-then-slice + skip-empty).\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: E3.1 deterministic entity extraction (hippo graph extract) (#88)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-01T17:09:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ab8fa86cbc2d385bc6af38762a3669a11d4e724b",
          "body": "…ed writer) (#87)\n\nCompletes the E3.3 graph-on-consolidated guard's last enforcement layer. The DB-level\ntriggers (v37) + the graph_extraction_queue shipped already; this adds the CI-level\nsingle-writer rule: scripts/check-graph-writes.mjs fails the build if any source file\nother than the sanctioned\n[…]\ne, basename-vs-exact-path, SQLite variants); all fixed per\noperator decision at the review cap.\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: E3.3 criterion-2 CI lint (graph writes funnel through the audit…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-01T16:11:08Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9cb3b76fa76c3788918678864e188a0280ea5288",
          "body": "…trate + raw-layer guard) (#86)\n\nFirst slice of the E3 graph layer. The graph sits on top of consolidated state and\nmust never index the raw layer. Adds the substrate + the DB-level guard that makes a\nraw-layer reference unrepresentable on every code path.\n\n- migration v37: entities, relations, grap\n[…]\np enqueue\nhook, the CI lint, and E3.4 graph-quality-under-supersession are deferred follow-ups.\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: E3.3 graph-on-consolidated guard (entities/relations/queue subs…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-01T14:14:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "093507cd01b763ef13d95f1357f2578829d7aa1f",
          "body": "… all 8 E2 objects (#85)\n\nAdds customer_note as the LAST E2 first-class object (after decision/prediction/\nincident/process/policy/skill/project_brief), mirroring src/project-briefs.ts.\n\n- migration v36: customer_notes table (customer + note cols), 3 indexes, 3\n  tenant-safety triggers incl supersed\n[…]\nject_brief episode applied correctly). With this,\nall eight E2 first-class objects are shipped.\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: E2 customer_note first-class object (entity-scoped) - completes…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-06-01T09:33:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "49d12ff4e9b307300e51fe7325fb59690c6946d7",
          "body": "…s from receipts) (#84)\n\nAdds project_brief as the 7th E2 first-class object (after decision/prediction/\nincident/process/policy/skill), mirroring src/skills.ts.\n\n- migration v35: project_briefs table (repo + summary cols), 3 indexes, 3\n  tenant-safety triggers incl supersede self-FK\n- src/project-b\n[…]\nesh could exceed the\nsummary cap) and a refreshed-mirror path-tag omission; both fixed at root.\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: E2 project_brief first-class object (repo-scoped, auto-refreshe…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-30T16:39:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d07556516dd8aebb2ba3f782929708884384719a",
          "body": "feat(skill): promote skill to a first-class object (E2, executable/exportable)",
          "is_bot": false,
          "headline": "Merge pull request #83 from kitfunso/feat/e2-skill-object",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-30T14:24:08Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "7d33ce35de8606cf2f21ba1eaac3d9525719cbd9",
          "body": "…exportable)\n\nA skill is a reusable, agent-followable capability: an `instructions` body plus\nan optional `trigger` (when to apply), evolving via the supersede delta lifecycle.\n\"Executable\" is scoped to an agent-followable instruction that is executed once\nexported into the agent's in-force rules; l\n[…]\nreleased; no package version bump.\n\nGates: plan-eng 86, code-review 94, independent-review 94, codex clean (no\nactionable issues).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(skill): promote `skill` to a first-class object (E2, executable/…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-30T14:20:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "af008d15c3040b7a6967204e6344333a363bf80e",
          "body": "feat(policy): promote policy to a first-class object (E2, bi-temporal)",
          "is_bot": false,
          "headline": "Merge pull request #82 from kitfunso/feat/e2-policy-object",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-30T11:27:38Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "78a0044ab2f772ea0e51f7e6bc37a236a3265793",
          "body": "A policy is a named rule in force over an effective-time range (valid_from /\nvalid_to) that evolves via the supersede delta lifecycle. Valid-time is\nfirst-class and queryable via an as-of query; transaction-time is present via\ncreated_at + the supersede chain (full time-travel deferred).\n\n- Migratio\n[…]\n89 (after a round-1 date-CRIT), code-review 94,\nindependent-review 94, codex 3 rounds (3 real bi-temporal issues, all root-fixed).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(policy): promote `policy` to a first-class object (E2, bi-temporal)",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-30T11:23:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ef6200af96e8953bd770840aa32333d4eab41aed",
          "body": "feat(process): promote process to a first-class object (E2)",
          "is_bot": false,
          "headline": "Merge pull request #81 from kitfunso/feat/e2-process-object",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-29T18:07:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9fedd8c7a48030fc3670ff6d53ac6381d6287e81",
          "body": "A process is a living process map: a named, ordered list of steps that\nevolves. Its delta lifecycle reuses the decision supersede path - a process\nevolves by being superseded by a new version that records what changed\n(change_summary) and the full new step list, carrying a server-derived\nversion cou\n[…]\ntaged in CHANGELOG Unreleased; no package version bump.\n\nGates: plan-eng 92, code-review 96, independent-review 92, codex P3-only.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(process): promote `process` to a first-class object (E2)",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-29T18:03:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "eefd60b93d8683bb8e23efa7c2d000d20b92c939",
          "body": "feat(incidents): promote incident to a first-class object (E2)",
          "is_bot": false,
          "headline": "Merge pull request #80 from kitfunso/feat/e2-incident-object",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-29T15:07:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d235b36e23e5ad7b656f48c87d630baa4447b4e9",
          "body": "Next E2 first-class object after decision (v1.15.0) and prediction (v1.13.0),\nmirroring the decisions implementation with an open -> resolved -> closed\nlifecycle (no supersede).\n\n- New `incidents` table (schema v31): memory-tenant safety triggers, ON DELETE\n  SET NULL on the memory mirror, linked_me\n[…]\nt-review 88, ship-readiness 93.\nBuild + 2192 vitest + 80 pytest green. Staged under CHANGELOG Unreleased; no\npackage version bump.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(incidents): promote `incident` to a first-class object (E2)",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-29T15:03:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7836ddfd3deddc5c1c61943e740eee74be547480",
          "body": "The roadmap docs lagged the code by several ships; three consecutive\n\"next\" items reproduce-checked as already-addressed. This reconciles both\ndocs against master (v1.15.0).\n\n- Priority queue: #1-3 done; #4 conflict-isolation deferred-by-design (not a\n  bug); #5 v0.26 UI partial/diverged.\n- Python S\n[…]\n hybrid-v4 3D mockup not pursued, keep/drop pending).\n- consolidate-audit-tenant-tag shipped v1.12.10; J3 v1.14.0 extension noted.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: reconcile TODOS + ROADMAP-RESEARCH with shipped master state",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-29T10:52:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "53b31974b1a3a4fb074f21fe6f630dfa60b4ceeb",
          "body": "chore(release): v1.15.0 (decisions first-class object) + SDK 0.3.0",
          "is_bot": false,
          "headline": "Merge pull request #79 from kitfunso/release/v1.15.0",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-28T21:29:49Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "3735f4b1c6285902625b2994217de3f16c7a8b19",
          "body": "Promotes the E2 decisions first-class object (PR #78) from CHANGELOG\nUnreleased to a versioned release.\n\n- Bump TS core 1.14.0 to 1.15.0 across the 4 lockstep manifests + lockfile.\n- Bump Python SDK hippo-memory-sdk 0.2.2 to 0.3.0 for the new Decision API.\n- Fix src/version.ts PACKAGE_VERSION drift \n[…]\n plan-eng 88, code-review 92, independent-review 94, codex pass,\nship-readiness 90. Build + 2159 TS tests + 74 Python tests green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): v1.15.0 (decisions first-class object) + SDK 0.3.0",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-28T21:25:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6bd3f647fcc8b1a34d899c95f75701f1c24ed1ec",
          "body": "feat(decisions): promote `decide` to a first-class object (E2)",
          "is_bot": false,
          "headline": "Merge pull request #78 from kitfunso/feat/e2-decision-object",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-28T20:16:50Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9a1a46d59655799eb730e110d51729c68f0e1495",
          "body": "Promote `hippo decide` from a tagged memory (which decayed on a 90-day\nhalf-life even while the decision was still in force) to a canonical\n`decisions` table that is the source of truth. Mirrors the shipped v0.31\nprediction object pattern.\n\n- schema migration v30: decisions table + 2 indexes + 3 ten\n[…]\n-review, independent-review, codex (3 rounds; caught a P1\nself-supersession bug, now fixed and regression-tested), ship-readiness.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(decisions): promote `decide` to a first-class object (E2)",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-28T19:24:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "27f5ae6ff08d41e2d161a18caad8702b9fc1d28d",
          "body": "Adds `* text=auto eol=lf` and applies a one-time `git add --renormalize .`.\nThe repo had mixed endings (TS=LF; Python, manifests, CHANGELOG, README, TODOS,\nmemory.ts=CRLF) with no .gitattributes and autocrlf=false, so any whole-file\nrewrite produced a spurious 2x-line-count diff (hit 3 times in the \n[…]\nied via git diff --ignore-space-at-eol;\nonly .gitattributes adds content). Pre-existing uncommitted ROADMAP.md WIP left\nuntouched.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: normalize line endings to LF via .gitattributes",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-28T16:21:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f97bad87ec8630421f76669b50f5ddfde35d7496",
          "body": "…Hint)\n\nReleases the J2 AvailabilityHint model + availability_hint field on RecallResult\n(shipped in npm v1.14.0) to the Python SDK. Source bumped + dist built; PyPI\nupload pending twine auth.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(python-sdk): bump hippo-memory-sdk 0.2.1 to 0.2.2 (Availability…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-28T16:16:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "91476433ad35a90a05d2d2207f54f3733f173f19",
          "body": "feat(recall): J2 availability-bias detector (v1.14.0)",
          "is_bot": false,
          "headline": "Merge pull request #77 from kitfunso/feat/j2-availability-bias",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-28T14:56:33Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d92c4491a899332f9c95f4beed1d0eacf21f382b",
          "body": "J1 [planned] to [shipped v1.13.2], J3 [next] to [shipped v1.13.1+v1.13.4],\nJ5 [next] to [shipped v1.13.5], J2 [planned] to [shipped v1.14.0], J-Wire\n[next, blocks J5+] to [done: dogfood 8/9 organic read-rate, no addendum needed].\nAdds a J2 shipped-note (Framing B+; audit_log tag-class base rate defe\n[…]\ndue) already shipped via PR #30/#31 + v1.12.1. ROADMAP.md #3 + its pre-existing\nuncommitted churn are left for a separate cleanup.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(roadmap): sync Track J tags to shipped state",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-28T14:47:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09dc4a340a79a0921a3566931ba40905eb0c72a6",
          "body": "Soft warning on RecallResult.availabilityHint when a recall top-K is\nrecency-dominated (over 70 percent of returned results from the last 24h)\nwhile older relevant matches in the same pool were passed over. Pure detector\nin src/availability.ts wired into api.recall, cmdRecall, and MCP plus the\nPytho\n[…]\nleak into the signal.\n\n16 pure-detector tests plus 5 api.recall integration tests. Minor bump\n1.13.5 to 1.14.0 across 4 manifests.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(recall): J2 availability-bias detector (Track J)",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-28T14:44:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c0d68ea995639ea947bd04170a109bd4f8fb201e",
          "body": "…4 Known Limitation)\n\nAdds the Pydantic model + RecallResult field for the\nPlanningFallacyWatching variant shipped in npm hippo-memory v1.13.4.\nThe v1.13.4 release noted the Python SDK gap as Known Limitation:\n\"Python SDK Pydantic model not extended in this release. Field appears\nin JSON as unknown-\n[…]\nst/hippo_memory_sdk-0.2.1-py3-none-any.whl dist/hippo_memory_sdk-0.2.1.tar.gz\nThe dist artifacts are built and ready (gitignored).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(python-sdk): v0.2.1 PlanningFallacyWatching model (closes v1.13.…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-27T17:34:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c61995c48cc575b2f6a619b4339f6da057f8c7ff",
          "body": "…read warnings)\n\nCloses the \"Single sub-agent per warning\" gap from round 1. 9 trials\ntotal: 3 question types per warning (planning, decision/trust,\nmeta/tooling) across J3.2 hint (v1.13.1), J3.2 watching (v1.13.4),\nand C5 cutoff (v1.13.3). J1 anchoring skipped (single-turn sub-agent\ndispatch cannot\n[…]\nlarger than N=1\" but not statistically\n  significant; directional signal not population claim.\n\nNo source code changes. Docs only.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(dogfood): round 2 larger-N read-rate measurement (8 of 9 trials …",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-27T17:16:25Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "43e86aded1940db87f03b95e6c2ef25dc1ef34b8",
          "body": "…ion policy doc\n\nFolds in 3 hygiene tickets from 4681c92 (week-of-2026-05-21 retro):\n\n1. scripts/check-manifest-versions.mjs (NEW): asserts 4 lockstep\n   manifests (root package.json, openclaw.plugin.json, extensions/\n   openclaw-plugin/{package.json, openclaw.plugin.json}) match\n   root version. Al\n[…]\n ship to npm).\n\nTODOS.md: 3 items marked done with provenance lines.\n\nNo source code changes. No tests changed. Pure infra + docs.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): wire prepublishOnly version + em-dash guards + iterat…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-27T17:12:38Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3b74adcb007a6d89740114118ed5e7719eb19f77",
          "body": "Per ROADMAP-RESEARCH.md L555 (Lovallo-Kahneman TFAS empirics: losses\n~2x larger than equivalent gains). Rebalances EMOTIONAL_MULTIPLIERS\ndefaults and adds HIPPO_LOSS_AVERSION_RATIO env var for per-domain\ntuning.\n\nChanges:\n- positive (success-tagged): 1.3 -> 1.0\n- negative (error-tagged): 1.5 -> 2.0\n\n[…]\nserver.ts not src/memory.ts).\n\nFunctional verify: 23 J5 tests + 32 benchmark tests all green. Build\nclean at tsc + tsc benchmarks.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(memory): v1.13.5 J5 loss-aversion calibration (Track J [next])",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-27T17:06:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d84f7ca13040a70d64f3d3ad19c80758764411d7",
          "body": "…ss-match\n\nDogfood diary 2026-05-27 Trial 2a captured the dominant J3.2 failure\nmode: a natural-language query \"will take 2 days to ship the next\nfeature\" matched the forward-claim regex but silently emitted nothing\nbecause its post-stopword tokens [feature] had zero overlap with the\nseeded class [e\n[…]\ns\nrelease. Field appears in JSON as unknown-extra; ignored by default\ndeserialiser. Follow-up patch will add the model for parity.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(predictions): v1.13.4 J3.2 watching variant closes silent no-cla…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-27T14:24:09Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "58ca50e49cf71fdb6c13e3c50c5590786595f23f",
          "body": "…lish)\n\nDogfood diary 2026-05-27 caught C5 shipping dark. A fresh sub-agent\nreading a v1.13.2 hippo response summarised the visible memories with\nzero mention of the 198 dropped candidates: the exact WYSIATI failure\nmode C5 is supposed to flag.\n\nTwo format defects, both fixed:\n\n1. Bottom placement. \n[…]\nuilt CLI shows \"Cutoff: showing 2 of 200\ncandidates; 28 dropped to fit limit.\" at top of output, before\n\"Found 2 memories\" header.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(recall): v1.13.3 C5 cutoff format normalisation (top + plain Eng…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-27T14:03:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "013206747671b10be4ff1848d4f7d4af20c7a2d7",
          "body": "Smoke test of v1.13.0-v1.13.2 Track J warnings against a fresh sub-agent\nreading hippo responses with no system prompt wiring.\n\nFindings:\n- J3.2 (planning fallacy): TOP-placed, plain English, quantitative.\n  Sub-agent quoted the warning verbatim and revised its plan from\n  \"2 days\" to \"3.5 to 4 days\n[…]\n, one model\ntested, no multi-turn coverage. Larger-N follow-up worth doing if\nv1.13.3 moves the C5 readability needle.\n\nDocs-only.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(dogfood): Track J warning agent-reads test (J3.2 organic, C5 dark)",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-27T13:41:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4681c924dfef18fa02e1403729ec1722c3b5e730",
          "body": "Outcome of the week-of-2026-05-21 retro covering v1.10.0 -> v1.13.2:\n\nROADMAP-RESEARCH.md (Track J):\n- New J-Wire item between J1 and J2, marked [next, blocks J5+].\n  Wire the existing C5 / J3.2 / J1 warnings into the MCP host\n  prompt and run a dogfood diary before shipping J5+. Without\n  this gate\n[…]\nkill iteration-threshold heuristic doc edit\n  (rounds 4-5 P2-only -> ship with Known Limitations).\n\nDocs-only, no source or tests.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: add J-Wire gating item + retro hygiene tickets",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-27T13:29:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f18652d222af47d9300ef08d7e83690e39023418",
          "body": "…ctor)\n\nPatch bump. Additive only:\n- New optional RecallResult.anchoringHint field\n- New env knob HIPPO_ANCHORING=off|track (default track)\n- 3 new audit ops (recall_anchor_detected_query_repeat + _memory_dominance + _skipped_no_session)\n- First wire-up of suppressedByInterference counter (placehold\n[…]\nn-eng round 3 PASS 91, code-review PASS 87, indep-review\nPASS 84, codex 6 rounds (1 documented residual hash-collision edge case).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump hippo-memory 1.13.1 to 1.13.2 (J1 anchoring dete…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-27T12:26:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ca2b3f5d2b50c857c2ef93c943a5987f1e56aa13",
          "body": "* docs(plan): J1 anchoring detector plan v3 (post 3 plan-eng-critic rounds)\n\nPlan-eng-critic chain: round 1 fail 62 (8 must_fixes including 3 CRIT:\nsuppressedByInterference invisible on cli/mcp surfaces, api.recall purity\ncontradicted by audit-emit, ghost CHANGELOG section), round 2 fail 78 (2\nNEW C\n[…]\ns\nJ1-v2 path).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(recall): J1 anchoring detector (recall-recurrence) (#76)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-27T12:25:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8cdb8b3b58cef7ab9af640ee80dbe6d97b3f04c1",
          "body": "Patch bump. Additive only:\n- New optional RecallResult.planningFallacyHint field\n- New env knob HIPPO_AUTODEBIAS=off|regex (default regex)\n- 3 new audit ops (recall_autodebias_hint + _no_class_match + _tiebreak)\n- emitAudit optional flag on computePredictionBaserate (default true)\n- Python SDK gets \n[…]\nently.\n\nFull suite: 2019 TS pass + 4 skip; 53 Python pass.\nCritic chain: plan-eng 88, code-review 90, indep-review 89, codex pass.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump hippo-memory 1.13.0 to 1.13.1 (J3.2 auto-injection)",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-26T21:28:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "babb89d5cafb4640bfcc1d097204f2989c0f03ae",
          "body": "… (#75)\n\n* docs(plan): J3.2 auto-injection plan v2 (post plan-eng-critic round 1 revisions)\n\nPlan-eng-critic round 1 score 72 returned 4 must-fixes:\n- Audit-op count drift in Files-modified table (prose said 3, table said 2)\n- Cited non-existent tests/audit-ops-lockstep.test.ts as safety net\n- Doubl\n[…]\n not pedantry.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(recall): J3.2 auto-injection of planning-fallacy hints on recall…",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-26T21:08:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e85569d6920b0223b7128d7f95546b4b852271ca",
          "body": "Bundles 4 PRs landed today (2026-05-26) for the v1.13.0 minor release:\n\n- #71 (08c3b94) feat: C5 WYSIATI cutoff transparency on RecallResult\n- #72 (0a3d03c) feat: E2 prediction first-class object (schema v29)\n- #73 (8ca4fa4) feat: J3 reference-class / planning-fallacy detector\n- #74 (9e1caf3) chore:\n[…]\nlugin.json + lockfile in lockstep\n(per manifest-version-drift-hygiene captured this session after\n3-PR-streak red openclaw check).\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(release): bump hippo-memory 1.12.12 to 1.13.0 (Track J bundled)",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-26T16:14:39Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9e1caf35ea4f00c11db808309d81fb8915272548",
          "body": "Closes a v1.12.11 -> v1.12.12 manifest version drift that has been\nred across 3 consecutive PRs (#71 C5, #72 E2, #73 J3). The drift\nlanded when v1.12.12 bumped package.json but missed\nopenclaw.plugin.json; tests/openclaw-package.test.ts asserts the\ntwo stay in sync.\n\nEach of the 3 prior PRs correctl\n[…]\nness-critic flagged the recurrence on PR #73 as risk to\nmasking real regressions. One-line fix.\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(openclaw): bump plugin manifest from 1.12.11 to 1.12.12 (#74)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-26T15:55:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8ca4fa4d209a4d60c8ca1c4fb2f3db781995fc98",
          "body": "Track J [next] from ROADMAP-RESEARCH.md L542. Reads from the E2\npredictions table (shipped at 0a3d03c earlier this release cycle)\nand computes per-class base-rate stats so the calling agent can\nanchor on its past track record rather than the inside view.\nLovallo-Kahneman (2003) inside-vs-outside vie\n[…]\ny folded during execute (single-site emit inside\nhelper). Code-review-critic gates this commit.\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(predictions): J3 reference-class / planning-fallacy detector (#73)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-26T15:42:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0a3d03c0454f6b3561e202a99758a06606c79e76",
          "body": "* feat(predictions): E2 prediction first-class object (schema v29)\n\nTrack J pre-req from ROADMAP-RESEARCH.md L314. Ships a canonical\npredictions table for ex-ante claims that can be closed against\nex-post outcomes. Enables J3 (reference-class / planning-fallacy\ndetector) as a follow-up episode.\n\nHyb\n[…]\n.14\nfollow-up.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(predictions): E2 prediction first-class object (schema v29) (#72)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-26T14:56:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "08c3b9478276bd0b6ba36db5cef4f0b93a10fd3f",
          "body": "* docs: add Track J cognitive diagnostics + C5 WYSIATI to roadmap\n\nThree additions to ROADMAP-RESEARCH.md inspired by Kahneman's TFAS:\n\n- E2 first-class objects table: new `prediction` row (ex-ante claim\n  closed against ex-post outcome, 6d, gated as Track J pre-req).\n- Track C Pineal Gland: new C5 \n[…]\nhavior change.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>\n\n---------\n\nCo-authored-by: Kit <kit@clawd.ai>\nCo-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(recall): C5 WYSIATI cutoff transparency on RecallResult (#71)",
          "author_name": "Keith So",
          "author_login": "kitfunso",
          "committed_at": "2026-05-26T12:04:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b7429684133941c7ee341f8bca05e86d60657bf6",
          "body": "…oupling arc)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump hippo-memory 1.12.11 to 1.12.12 (bundled E1-E5 DAG live-c…",
          "author_name": "Kit",
          "author_login": "kitfunso",
          "committed_at": "2026-05-25T23:04:46Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3a6ec1981a1bbaacca537f5084ba77f1cce5a59c",
          "body": "Final episode of 5-arc. Aggregates per-entity L2 topic summaries into L3\nentity profiles via buildEntityProfiles (mirrors buildDag L1->L2 pattern,\none level up). Widens 5 SQL guards in store.ts from dag_level=2 to\nIN (2, 3) so rebuildDirtySummaries handles dirty L3 via the same\napplyRebuildResult pa\n[…]\ns.md (v3.1)\n\nAfter E5 ship-ready: bundled merge sequence (E1 to E5) + npm publish\nv1.12.12 per Keith's \"one bundled release\" pick.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dag): E5 level-3 entity profiles + drillDown depth",
          "author_name": "Kit",
          "author_login": "kitfunso",
          "committed_at": "2026-05-25T23:00:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "486940b8b0a15783f9743b4768632e06609d6795",
          "body": "Adds summaryDeboost (default 0.85, env HIPPO_SUMMARY_DEBOOST overrides,\nper-call option wins) on L2 summary composite scores in hybridSearch,\nphysicsSearch (physics-particle path), and shared.searchBothHybrid. Plus\na freshness micro-boost (1.05 if last_rebuilt_at within 7 days, consuming\nE3 column) \n[…]\nicsSearch hybridSearch-fallback inherits via options spread\n18: isDagSummary helper\n\nFull suite: 1892 passed, 4 skipped, 0 failed.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(search): E4 DAG-aware scoring deboost + breakdown",
          "author_name": "Kit",
          "author_login": "kitfunso",
          "committed_at": "2026-05-25T23:00:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "102269520ebf605760356d59369df28f44074017",
          "body": "…pling arc)\n\nConsumer of E2's summary_dirty flag. Walks dirty L2 summaries, regenerates\neach via generateDagSummary, atomically refreshes content + 6 metadata\ncolumns + clears summary_dirty (with FTS sync). Gated on ANTHROPIC_API_KEY\n(same gate as buildDag). HIPPO_DAG_REBUILD_CAP=20 default with har\n[…]\n5 passed, 4 skipped, 0 failed.\n\nEpisode: 01KSGB90ZC21XYTBGRASHDGFA3\nPlan: docs/plans/2026-05-25-dag-e3-rebuild-summaries.md (v2.1)\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dag): E3 sleep-cycle rebuildDirtySummaries (E3 of 5 DAG live-cou…",
          "author_name": "Kit",
          "author_login": "kitfunso",
          "committed_at": "2026-05-25T23:00:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f4fbf9a941df11272005473b5eb112ff15ae90c0",
          "body": "independent-review-critic R2 MED: S5 code block still showed\nunexported helper after R1 fold; no S7 section or AC13 for the\nbatchWriteAndDelete hook. Plan-vs-code drift.\n\nPlan v2.1 sync:\n- S5 code block + helper signature: 'function' -> 'export function'\n- S5 doc: lists 5 hook sites (was 4); JSDoc r\n[…]\ndDelete hook per R1 HIGH fold\n- AC13 NEW: locks the batch hook against future regression\n\nNo code change. Documentation-only sync.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(dag): update E2 plan v2.1 with S7 batch hook section + AC13",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-25T23:00:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8bed912ffaad1a7b5ccc2e0a832c72f093035498",
          "body": "independent-review-critic R1 HIGH: batchWriteAndDelete bypasses E2's\n4 hook sites. consolidate.ts/sleep flushes pendingWrites +\npendingDeletes through this path every cycle (decay-survivor updates,\nsub-threshold deletes, merge weakening). Parent summaries NEVER got\nmarked dirty for the dominant muta\n[…]\nersede; only S2 fires; +1 audit row delta).\n\nTests: 1863/1867 pass (+1 from E2's previous 1862) + 4 skipped + 0\nfailed. tsc clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dag): batchWriteAndDelete hook + plan AC9 drift (E2 critic fold-in)",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-25T23:00:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1d5fa93cc57508cc962b7e5d8aa629bbf1e9c9cd",
          "body": "…ing arc)\n\nWires E1's markSummaryDirty into the 4 child-mutation hook insertion\npoints so the dirty flag E1 added now flips when something actually\nmutates a child of a level-2 summary. Without E2, the column exists\nbut stays 0 forever. E3 sleep-cycle rebuild needs this signal.\n\n4 hooks via new mark\n[…]\nelete-branch or PR for E2 auto-\ncloses. Plain gh pr merge 66 --rebase.\n\nTests: 1862 / 1866 pass + 4 skipped + 0 failed. tsc clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(dag): child-write dirty-flag propagation (E2 of 5 DAG live-coupl…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-25T23:00:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "834afb2596f719e073b19aaa2fab57f0edfac615",
          "body": "…lip)\n\n3 openclaw manifests stuck at 1.12.10 on master while package.json\nbumped to 1.12.11 in the v1.12.11 publish. tests/openclaw-package.test.ts\ncatches this drift; failure is currently red on master and on this PR's\nCI. TODOS.md line ~490 'Version-parity guard across manifests' tracks\nthe underl\n[…]\nto\na separate chore PR but the 3-line fix is small and clears the runway\nfor the DAG batch. Author owns the v1.12.11 publish slip.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(openclaw): bump plugin manifests to 1.12.11 (v1.12.11 publish s…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-25T22:55:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "361de5542f3b8476be9d1fcd331d27d03dc53a57",
          "body": "Pre-existing drift: lockfile was stale at v0.1.0 on master through the\nentire E1-E5 Obsidian-inspired UI stack (v0.2.1 -> v0.2.5 ship cycle in\nv1.12.11). Caught by DAG E1 ship-readiness critic.\n\nSync to v0.2.5 (current ui/package.json). Not E1 scope; rides along on\nthis branch since the lockfile drift was sitting in the working tree\nwhen E1 work started.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(ui): sync lockfile to ui-brain-observatory v0.2.5",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-25T22:55:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2127e5aad1b0d547b937bf471150635a0be5a54f",
          "body": "…d-in)\n\nIndependent-review-critic R1 MED: the WHERE id=? AND tenant_id=? guard\nin markSummaryDirty correctly rejects cross-tenant attack writes (UPDATE\nmatches 0 rows, no audit row leaks), but no test locks the invariant.\nDropping the tenant_id clause in a future edit would pass the prior 7\ncases.\n\n\n[…]\n), assert loadDirtySummaries returns empty for\nBOTH tenants AND no audit row written.\n\nTests: 8/8 pass for the E1 file. tsc clean.\n\nCo-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(dag): cross-tenant attack write test (independent-review MED fol…",
          "author_name": "Kit",
          "author_login": null,
          "committed_at": "2026-05-25T22:55:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 100,
      "commits_last_year": 656,
      "latest_release_at": "2026-07-18T18:49:21Z",
      "latest_release_tag": "v1.27.0",
      "releases_from_tags": false,
      "days_since_last_push": 5,
      "active_weeks_last_year": 17,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 4.4
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 42,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "hippo-memory",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "memory",
            "ai",
            "agents",
            "llm",
            "claude",
            "context",
            "recall",
            "episodic",
            "semantic",
            "embeddings",
            "hybrid-search"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/hippo-memory",
          "is_deprecated": false,
          "latest_version": "1.27.0",
          "repository_url": "https://github.com/kitfunso/hippo-memory",
          "versions_count": 141,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 3766,
          "first_published_at": "2026-03-15T11:45:18.957000Z",
          "latest_published_at": "2026-07-18T18:49:01.052000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        },
        {
          "name": "hippo-memory-sdk",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "memory",
            "ai-agents",
            "rag",
            "hippo-memory",
            "Development Status :: 3 - Alpha",
            "Intended Audience :: Developers",
            "License :: OSI Approved :: MIT License",
            "Programming Language :: Python :: 3",
            "Programming Language :: Python :: 3.10",
            "Programming Language :: Python :: 3.11",
            "Programming Language :: Python :: 3.12",
            "Programming Language :: Python :: 3.13",
            "Typing :: Typed"
          ],
          "ecosystem": "pypi",
          "matches_repo": true,
          "registry_url": "https://pypi.org/project/hippo-memory-sdk/",
          "is_deprecated": false,
          "latest_version": "0.3.0",
          "repository_url": "https://github.com/kitfunso/hippo-memory",
          "versions_count": 5,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": null,
          "monthly_downloads": 83,
          "first_published_at": "2026-05-23T19:36:01.685276Z",
          "latest_published_at": "2026-05-29T09:50:52.693463Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 55
        }
      ]
    },
    "popularity": {
      "forks": 37,
      "stars": 717,
      "watchers": 1,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-15",
            "count": 1
          },
          {
            "date": "2026-03-16",
            "count": 1
          },
          {
            "date": "2026-04-05",
            "count": 1
          },
          {
            "date": "2026-04-06",
            "count": 1
          },
          {
            "date": "2026-04-07",
            "count": 9
          },
          {
            "date": "2026-04-08",
            "count": 2
          },
          {
            "date": "2026-04-10",
            "count": 1
          },
          {
            "date": "2026-04-13",
            "count": 2
          },
          {
            "date": "2026-04-14",
            "count": 1
          },
          {
            "date": "2026-04-15",
            "count": 4
          },
          {
            "date": "2026-04-18",
            "count": 1
          },
          {
            "date": "2026-04-25",
            "count": 1
          },
          {
            "date": "2026-04-27",
            "count": 1
          },
          {
            "date": "2026-04-30",
            "count": 1
          },
          {
            "date": "2026-05-02",
            "count": 1
          },
          {
            "date": "2026-05-12",
            "count": 2
          },
          {
            "date": "2026-05-15",
            "count": 1
          },
          {
            "date": "2026-05-18",
            "count": 1
          },
          {
            "date": "2026-05-23",
            "count": 1
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-06-08",
            "count": 1
          },
          {
            "date": "2026-06-16",
            "count": 1
          },
          {
            "date": "2026-07-01",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 37,
        "total_forks": 37
      },
      "star_history": null,
      "open_issues_and_prs": 9
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "python/src/hippo_memory/py.typed",
        "tsconfig.json",
        "ui/tsconfig.json",
        "website/tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 352615,
      "source_files_sampled": 631,
      "oversized_source_files": 5,
      "agent_instruction_files": [
        "AGENTS.md"
      ],
      "agent_instruction_max_bytes": 1782
    },
    "dependencies": {
      "manifests": [
        "package.json",
        "python/pyproject.toml",
        "ui/package.json",
        "website/package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [
          {
            "name": "protobufjs",
            "direct": false,
            "version": "6.11.6",
            "severity": "critical",
            "ecosystem": "npm",
            "cvss_score": 9.8,
            "advisory_ids": [
              "GHSA-2pr8-phx7-x9h3",
              "GHSA-66ff-xgx4-vchm",
              "GHSA-685m-2w69-288q",
              "GHSA-75px-5xx7-5xc7",
              "GHSA-f38q-mgvj-vph7",
              "GHSA-fx83-v9x8-x52w",
              "GHSA-jggg-4jg4-v7c6",
              "GHSA-jvwf-75h9-cwgg",
              "GHSA-q6x5-8v7m-xcrf",
              "GHSA-wcpc-wj8m-hjx6"
            ],
            "fixed_version": "8.6.0",
            "advisory_count": 11,
            "oldest_advisory_days": 98
          },
          {
            "name": "adm-zip",
            "direct": false,
            "version": "0.5.18",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.5,
            "advisory_ids": [
              "GHSA-xcpc-8h2w-3j85"
            ],
            "fixed_version": "0.6.0",
            "advisory_count": 1,
            "oldest_advisory_days": 13
          },
          {
            "name": "sharp",
            "direct": false,
            "version": "0.32.6",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.3,
            "advisory_ids": [
              "GHSA-f88m-g3jw-g9cj"
            ],
            "fixed_version": "0.35.0",
            "advisory_count": 1,
            "oldest_advisory_days": 2
          },
          {
            "name": "sharp",
            "direct": false,
            "version": "0.34.5",
            "severity": "high",
            "ecosystem": "npm",
            "cvss_score": 7.3,
            "advisory_ids": [
              "GHSA-f88m-g3jw-g9cj"
            ],
            "fixed_version": "0.35.0",
            "advisory_count": 1,
            "oldest_advisory_days": 2
          }
        ],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {
          "high": 3,
          "critical": 1
        },
        "advisory_count": 14,
        "affected_count": 4,
        "assessed_count": 139,
        "malicious_count": 0,
        "assessed_package": "npm:hippo-memory@1.27.0",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm",
        "pypi"
      ],
      "dependencies": [
        {
          "name": "httpx",
          "manifest": "python/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=0.27"
        },
        {
          "name": "pydantic",
          "manifest": "python/pyproject.toml",
          "ecosystem": "pypi",
          "version_constraint": ">=2.0"
        },
        {
          "name": "@types/three",
          "manifest": "ui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.184.0"
        },
        {
          "name": "d3-force",
          "manifest": "ui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.0.0"
        },
        {
          "name": "react",
          "manifest": "ui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "react-dom",
          "manifest": "ui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^19.0.0"
        },
        {
          "name": "three",
          "manifest": "ui/package.json",
          "ecosystem": "npm",
          "version_constraint": "^0.184.0"
        },
        {
          "name": "@astrojs/preact",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.1.4"
        },
        {
          "name": "@astrojs/sitemap",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^3.7.3"
        },
        {
          "name": "@fontsource-variable/bricolage-grotesque",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.10"
        },
        {
          "name": "@fontsource-variable/hanken-grotesk",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.8"
        },
        {
          "name": "@fontsource-variable/jetbrains-mono",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^5.2.8"
        },
        {
          "name": "@tailwindcss/vite",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.0"
        },
        {
          "name": "astro",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^6.4.2"
        },
        {
          "name": "preact",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^10.29.2"
        },
        {
          "name": "tailwindcss",
          "manifest": "website/package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.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": 8,
        "merged_prs": 102,
        "open_issues": 1,
        "closed_ratio": 0.857,
        "closed_issues": 6,
        "closed_unmerged_prs": 15
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "kitfunso",
          "commits": 111,
          "avatar_url": "https://avatars.githubusercontent.com/u/68618199?v=4"
        },
        {
          "type": "User",
          "login": "claude",
          "commits": 89,
          "avatar_url": "https://avatars.githubusercontent.com/u/81847?v=4"
        }
      ],
      "contributors_sampled": 2,
      "top_contributor_share": 0.555
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "pypi-publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json",
        "uv.lock"
      ],
      "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": "24 out of 24 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/30 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": 10,
            "reason": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": 10,
            "reason": "packaging workflow detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": 2,
            "reason": "dependency not pinned by hash detected -- score normalized to 2",
            "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": 0,
            "reason": "38 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "3dab4b5f4398d99e0404284099b374fda461d470",
        "ran_at": "2026-07-24T04:49:44Z",
        "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-18T18:52:21Z",
      "oldest_open_prs": [
        {
          "number": 109,
          "created_at": "2026-06-09T22:01:01Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 116,
          "created_at": "2026-07-01T16:55:34Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 118,
          "created_at": "2026-07-02T11:34:44Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 119,
          "created_at": "2026-07-02T11:58:12Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 120,
          "created_at": "2026-07-02T15:23:45Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 121,
          "created_at": "2026-07-02T15:47:02Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 122,
          "created_at": "2026-07-03T15:59:00Z",
          "last_comment_at": null,
          "last_comment_author": null
        },
        {
          "number": 125,
          "created_at": "2026-07-05T14:42:21Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-18T18:48:11Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": [
        {
          "number": 10,
          "created_at": "2026-04-15T13:34:20Z",
          "last_comment_at": "2026-04-15T14:19:27Z",
          "last_comment_author": "anh-chu"
        }
      ]
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/kitfunso/hippo-memory",
    "host": "github.com",
    "name": "hippo-memory",
    "owner": "kitfunso"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "moderate",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 67,
      "inputs": {
        "security": 50,
        "vitality": 86,
        "community": 56,
        "governance": 59,
        "engineering": 77
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 86,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 76,
            "inputs": {
              "commits_last_year": 656,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 17
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "17/52 weeks with commits",
                "points": 11.8,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 17
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "656 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 656
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v1.27.0",
              "releases_from_tags": false,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 4.4
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "100 releases published",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "releases_published",
                    "params": {
                      "count": 100
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~4.4 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 4.4
                    }
                  }
                ],
                "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": "moderate",
        "name": "Community & Adoption",
        "value": 56,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 59,
            "inputs": {
              "forks": 37,
              "stars": 717,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "717 stars",
                "points": 46.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 717
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "37 forks",
                "points": 13,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 37
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 60,
            "inputs": {
              "packages": [
                "hippo-memory",
                "hippo-memory-sdk"
              ],
              "dependents": null,
              "ecosystems": "npm, pypi",
              "total_downloads": null,
              "monthly_downloads": 3849
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "3,849 downloads/month across npm, pypi",
                "points": 47.8,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 3849,
                      "ecosystems": "npm, pypi"
                    }
                  }
                ],
                "max_points": 80
              },
              {
                "key": "registry_dependents",
                "name": "Registry dependents",
                "detail": "not reported by this ecosystem",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_reported_by_this_ecosystem",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          }
        ],
        "description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
      },
      {
        "key": "governance",
        "band": "moderate",
        "name": "Sustainability & Governance",
        "value": 59,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 25,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 2,
              "top_contributor_share": 0.555
            },
            "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 56% of commits",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 56
                    }
                  }
                ],
                "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": "good",
            "name": "Issue & PR responsiveness",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "merged_prs": 102,
              "open_issues": 1,
              "closed_issues": 6,
              "issue_closed_ratio": 0.857,
              "closed_unmerged_prs": 15
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "86% of issues closed",
                "points": 40.1,
                "status": "partial",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 86
                    }
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "102/117 decided PRs merged",
                "points": 33.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 102,
                      "decided": 117
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/30 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "moderate",
            "name": "Ownership & stewardship",
            "note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "verified_domain"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 53,
            "inputs": {
              "followers": 17,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "kitfunso",
              "public_repos": 35,
              "account_age_days": 2193
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "17 followers of kitfunso",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 17,
                      "login": "kitfunso"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "35 public repos, account ~6 yr old",
                "points": 23.3,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 35
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 6
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "hippo-memory",
                "hippo-memory-sdk"
              ],
              "ecosystems": "npm, pypi",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "2 package(s) on npm, pypi",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 2,
                      "ecosystems": "npm, pypi"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "141 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 141
                    }
                  }
                ],
                "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": 77,
        "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": "24 out of 24 merged PRs checked by a CI test -- score normalized to 10",
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "excellent",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 90,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": "https://hippo-memory.com",
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": "https://hippo-memory.com",
                "points": 15,
                "status": "met",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": 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": "moderate",
        "name": "Security",
        "value": 50,
        "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": "24 out of 24 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/30 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": "30 commit(s) and 3 issue activity found in the last 90 days -- score normalized to 10",
                "points": 7.5,
                "status": "met",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow detected",
                "points": 5,
                "status": "met",
                "details": [],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "dependency not pinned by hash detected -- score normalized to 2",
                "points": 1,
                "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": "38 existing vulnerabilities detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "good",
            "name": "Dependency advisories",
            "note": "Matched the npm:hippo-memory@1.27.0 runtime dependency closure — what installing the published package pulls in — 139 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:hippo-memory@1.27.0",
                  "assessed": 139
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 71,
            "inputs": {
              "source": "osv",
              "advisories": 14,
              "affected_packages": 4,
              "assessed_packages": 139,
              "unassessed_packages": 0,
              "affected_by_severity": "critical 1, high 3",
              "direct_affected_packages": 0
            },
            "components": [
              {
                "key": "direct_dependencies_free_of_known_advisories",
                "name": "Direct dependencies free of known advisories",
                "detail": "no direct dependency carries a known advisory",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "no_direct_advisories",
                    "params": {}
                  }
                ],
                "max_points": 35
              },
              {
                "key": "indirect_dependencies_free_of_known_advisories",
                "name": "Indirect dependencies free of known advisories",
                "detail": "4 affected: protobufjs 6.11.6 (critical 9.8), adm-zip 0.5.18 (high 7.5), sharp 0.32.6 (high 7.3), +1 more",
                "points": 3.5,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_affected",
                    "params": {
                      "count": 4,
                      "packages": "protobufjs 6.11.6 (critical 9.8), adm-zip 0.5.18 (high 7.5), sharp 0.32.6 (high 7.3)"
                    }
                  },
                  {
                    "code": "advisories_affected_more",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "1 advisory-carrying package(s) unaddressed past 90 days; oldest published 98 days ago",
                "points": 32.1,
                "status": "partial",
                "details": [
                  {
                    "code": "advisories_stale",
                    "params": {
                      "days": 90,
                      "count": 1,
                      "oldest": 98
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "excellent",
            "name": "Malicious dependencies",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "source": "osv",
              "meaning": "reported as a malicious package by the OpenSSF corpus; the remedy is removal or moving off the compromised name, never an upgrade of the same artifact. Versions the registry has since pulled are listed but not scored",
              "packages": [],
              "red_flag": false,
              "assessed_packages": 139,
              "malicious_packages": 0,
              "direct_malicious_packages": 0,
              "withdrawn_malicious_packages": 0,
              "installable_malicious_packages": 0
            },
            "components": [
              {
                "key": "no_dependency_reported_as_a_malicious_package",
                "name": "No dependency reported as a malicious package",
                "detail": "no dependency is reported as a malicious package",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "no_malicious_dependencies",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          },
          {
            "key": "high_risk_jurisdiction_exposure",
            "band": "excellent",
            "name": "High-Risk Jurisdiction Exposure",
            "note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
            "notes": [
              {
                "code": "jurisdiction_evidence_limits",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "meaning": "self-published location evidence; not nationality or citizenship",
              "red_flag": false,
              "exposures": [],
              "policy_countries": [
                "Russia",
                "Iran",
                "North Korea"
              ],
              "review_only_matches": 0,
              "assessed_self_published_locations": 2
            },
            "components": [
              {
                "key": "policy_exposure_multiplier",
                "name": "Policy exposure multiplier",
                "detail": "no confirmed policy-scope location match",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "jurisdiction_no_match",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "good",
        "name": "AI Readiness",
        "value": 73,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "excellent",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "AGENTS.md"
              ],
              "agent_instruction_max_bytes": 1782
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "AGENTS.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "AGENTS.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "llms.txt present",
                "points": 15,
                "status": "met",
                "details": [
                  {
                    "code": "llms_txt_present",
                    "params": {}
                  }
                ],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 100,
                      "sampled": 100
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": null,
            "notes": [],
            "value": 55,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json",
                "uv.lock"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "python/src/hippo_memory/py.typed",
                "tsconfig.json",
                "ui/tsconfig.json",
                "website/tsconfig.json"
              ],
              "agent_commit_share": 0.88,
              "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": "python/src/hippo_memory/py.typed, tsconfig.json, ui/tsconfig.json, website/tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "python/src/hippo_memory/py.typed, tsconfig.json, ui/tsconfig.json, website/tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "88 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 88,
                      "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 2",
                "points": 2,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 352615,
              "source_files_sampled": 631,
              "oversized_source_files": 5
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "5/631 source files over 60KB",
                "points": 54.6,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 631,
                      "oversized": 5
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-24T04:49:58.974277Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/k/kitfunso/hippo-memory.svg",
  "full_name": "kitfunso/hippo-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 statisticsnpm, PyPI.