Public record
Software health reportschema 0.30.0 · metrics 2.5.0 · 2026-08-03 16:12 UTC

sdsrss / claude-mem-lite

Persistent long-term memory for Claude Code via MCP — captures coding decisions, bugfixes, and context across sessions. Hybrid FTS5 + TF-IDF search with episode batching. Single SQLite DB, no external services. Alternative to claude-mem with 600x lower cost.

JavaScriptMIT★ 49 stars⑂ 3 forkssince Feb 2026View on GitHub ↗
KindCommand-line toolMCP serverLibraryhow this is determined

sdsrss/claude-mem-lite holds a health index of 71 out of 100, placing it in the Good band. It scores highest on Vitality (83/100) and lowest on Community & Adoption (46/100). It was last updated 10 days ago. A single contributor accounts for most of its recent work.

71
overall / 100
Good

Software health index

Metrics are grouped into weighted categories on one standardized 1–100 scale. Overall starts as their weighted mean, calibrated against the distribution of the public record so bands carry percentile meaning; when public evidence triggers the High-Risk Jurisdiction Policy, the rating is adjusted and receives an At Risk ceiling of 34.

71
Exceptional93-100The record's top tier (≈ top 5%); essentially all checked criteria met
Excellent80-92Strong across the board; minor gaps
Good65-79Healthy; gaps are limited and manageable
Moderate50-64Acceptable with notable gaps; review recommended
Weak35-49Material weaknesses across several areas
At Risk20-34Significant weaknesses; adoption warrants caution
Critical1-19Severe 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.

The weighted overall 63 is calibrated to 71 on the published index scale (record calibration 2026-08-02).

Ownership

sdsrssPersonal account
3 followers12 public repossince Sep 2025

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 publish
npmclaude-mem-lite3.59.18,08425210 days ago

Metrics by category

Vitality

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

83Excellent · 21% of overall
How it's scored
28.8/36Push recency — last push 10 days ago
16.6/36Commit cadence — 24/52 weeks with commits
18/18Commit volume — 829 commits in the last year
10/10OpenSSF Scorecard: Maintained — 30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
Inputs used
commits_last_year829
human_commit_share1
days_since_last_push10
active_weeks_last_year24

Release discipline

98Exceptional
How it's scored
27/27Ships releases — 100 releases published
36/36Release recency — latest release 10 days ago
27/27Release cadence — a release every ~0.6 days
8/10OpenSSF Scorecard: Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
Inputs used
releases_count100
latest_release_tagv3.59.1
releases_from_tagsno
days_since_latest_release10
mean_days_between_releases0.6

Community & Adoption

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

46Weak · 17% of overall
How it's scored
27.3/60Stars — 49 stars
2.5/25Forks — 3 forks
0/15Watchers — 0 watchers
Inputs used
forks3
stars49
watchers0
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
How it's scored
22.5/22.5README
22.5/22.5License — recognized license (MIT)
0/18CONTRIBUTING guide
0/13.5Code of conduct
0/7.2Issue template
0/6.3PR template
Inputs used
has_readmeyes
has_licenseyes
readme_badges0
has_contributingno
has_issue_templateno
has_code_of_conductno
readme_badge_services
has_pull_request_templateno
How it's scored
52.1/80Monthly downloads — 8,084 downloads/month across npm
0/20Registry dependents — not reported by this ecosystem
Inputs used
packagesclaude-mem-lite
dependents
ecosystemsnpm
total_downloads
monthly_downloads8,084
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?

50Moderate · 23% of overall
How it's scored
9/54Bus factor — 1 contributor(s) cover half of all commits
0/22.5Commit distribution — top contributor authored 100% of commits
1.4/13.5Contributor breadth — 1 contributors
0/10OpenSSF Scorecard: Contributors — project has 0 contributing companies or organizations -- score normalized to 0
Inputs used
bus_factor1
contributors_sampled1
top_contributor_share1
How it's scored
42/42Issue resolution — 100% of issues closed
27/30PR acceptance — 9/10 decided PRs merged
0/13Newcomer PR acceptance — no first-time contributor's PR decided in 30d
0/15OpenSSF Scorecard: Code-Review — Found 0/30 approved changesets -- score normalized to 0
Inputs used
merged_prs9
open_issues0
closed_issues5
prs_merged_7d0
prs_decided_7d0
prs_merged_30d0
prs_decided_30d0
issue_closed_ratio1
closed_unmerged_prs1
first_time_authors_30d0
first_time_prs_merged_30d0
first_time_prs_decided_30d0
Excluded from scoring (no data or not applicable): newcomer_pr_acceptance. Remaining weights renormalized.
How it's scored
10/30Ownership backing — personal (user) account
0/20Verified domain — not applicable to user accounts
4.3/25Owner reach — 3 followers of sdsrss
9.9/25Track record — 12 public repos, account ~0 yr old
Inputs used
followers3
owner_typeUser
is_verified
owner_loginsdsrss
public_repos12
account_age_days333
Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.

Package maintenance

100Exceptional
How it's scored
25/25Published & resolvable — 1 package(s) on npm
35/35Publish recency — latest publish 10 days ago
20/20Version history — 252 published versions
20/20Not deprecated — active, not deprecated or yanked
Inputs used
packagesclaude-mem-lite
ecosystemsnpm
any_deprecatedno
min_days_since_publish10

Engineering Quality

Are baseline engineering and documentation practices in place?

78Good · 19% of overall
How it's scored
24/24CI workflows — 2 workflow(s)
24/24Tests present
16/16Linter config — eslint.config.mjs
0/9.6Pre-commit hooks
0/6.4.editorconfig
0/20OpenSSF Scorecard: CI-Tests — no data
Inputs used
has_ciyes
has_testsyes
has_editorconfigno
has_linter_configyes
has_precommit_configno
Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.
How it's scored
30/30README
25/25Documentation directory
0/15Documentation / homepage site
10/10Repository description
10/10Topics — 20 topics
0/10Wiki
Inputs used
topicsclaude-code, fts5, hooks, mcp, memory, persistence, sqlite, agent-memory, ai-coding-assistant, ai-memory, anthropic, claude, claude-code-plugin, hybrid-search, llm-memory, long-term-memory, mcp-server, model-context-protocol, rag, semantic-search
has_wikino
homepage
has_readmeyes
has_docs_diryes
has_descriptionyes

Security

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

55Moderate · 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
0/2.5CI-Tests — no data
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/2.5Contributors — project has 0 contributing companies or organizations -- score normalized to 0
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 0 issue activity found in the last 90 days -- score normalized to 10
5/5Packaging — packaging workflow detected
2.5/5Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 5
0/5SAST — no SAST tool detected
0/5Security-Policy — security policy file not detected
6/7.5Signed-Releases — 5 out of the last 5 releases have a total of 5 signed artifacts.
0/7.5Token-Permissions — detected GitHub workflow tokens with excessive permissions
3.8/7.5Vulnerabilities — 5 existing vulnerabilities detected
Inputs used
sourceopenssf_scorecard
checks_evaluated17
scorecard_versionv5.5.0
checks_inconclusive1
scorecard_aggregate4.4
Excluded from scoring (no data or not applicable): ci_tests. Remaining weights renormalized.

Dependency advisories

100Exceptional
How it's scored
35/35Direct dependencies free of known advisories — no direct dependency carries a known advisory
25/25Indirect dependencies free of known advisories — no indirect dependency carries a known advisory
0/40No advisories left outstanding — no advisory carries a publication date
Inputs used
sourceosv
advisories0
affected_packages0
assessed_packages130
unassessed_packages0
affected_by_severitynone
direct_affected_packages0
Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:claude-mem-lite@3.59.1 runtime dependency closure — what installing the published package pulls in — 130 packages. Reachability is not analyzed.

AI Readiness

How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight (4%): agent tooling is a real maintenance signal, but a repository with none can still reach 100/100.

64Moderate · 4% of overall
How it's scored
45/45Agent instructions — CLAUDE.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_filesCLAUDE.md
agent_instruction_max_bytes9,548
How it's scored
0/18One-command bootstrap
22/22Automated tests
11/11Lint / format config — eslint.config.mjs
0/11Static type checking
10/10Reproducible environment — lockfile
10/10Demonstrated agent practice — 100 of the last 100 commits agent-authored or agent-credited
0/8Automated maintenance — no automated dependency updates observed
5/10OpenSSF Scorecard: Pinned-Dependencies — dependency not pinned by hash detected -- score normalized to 5
Inputs used
has_nixno
has_testsyes
lockfilespackage-lock.json
has_dockerfileno
typed_languageno
bootstrap_files
has_devcontainerno
has_linter_configyes
typecheck_configs
agent_commit_share1
toolchain_manifests
dependency_bot_commit_share0
How it's scored
0/45Type-checkable code — JavaScript without a type-check config
52.8/55Manageable file sizes — 16/396 source files over 60KB
Inputs used
primary_languageJavaScript
largest_source_bytes164,531
source_files_sampled396
oversized_source_files16
How it's scored
0/40API schema (OpenAPI/GraphQL/proto)
20/20MCP server
0/40Runnable examples
Inputs used
example_dirs
has_mcp_signalyes
api_schema_files

Key facts

49GitHub stars
1contributors
829commits, last 12 months
10days since last push
100releases
1bus factor
0open issues
npmpackage 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 ★ / 3 ⇿
0Stars
3Forks
26Releases

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.

12233312026-032026-052026-06
Major 1Minor 19Patch 6
OpenSSF Scorecard 4.4 / 10
4.4aggregate

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-08-03 16:11 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
n/aCI-Testsno pull request found
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/30 approved changesets -- score normalized to 0
0Contributorsproject has 0 contributing companies or organizations -- score normalized to 0
10Dangerous-Workflowno dangerous workflow patterns detected
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
10Maintained30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10
10Packagingpackaging workflow detected
5Pinned-Dependenciesdependency not pinned by hash detected -- score normalized to 5
0SASTno SAST tool detected
0Security-Policysecurity policy file not detected
8Signed-Releases5 out of the last 5 releases have a total of 5 signed artifacts.
0Token-Permissionsdetected GitHub workflow tokens with excessive permissions
5Vulnerabilities5 existing vulnerabilities detected
Direct dependencies 3
RegistryPackageVersion constraintManifest
npm@modelcontextprotocol/sdk^1.26.0package.json
npmbetter-sqlite3^12.6.2package.json
npmzod^4.3.6package.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 0

Installing npm:claude-mem-lite@3.59.1 pulls in 130 packages, direct and transitive: 0 carry known advisories, of which 0 are direct dependencies.

No known advisories affect the assessed dependencies.

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": [
        "claude-code",
        "fts5",
        "hooks",
        "mcp",
        "memory",
        "persistence",
        "sqlite",
        "agent-memory",
        "ai-coding-assistant",
        "ai-memory",
        "anthropic",
        "claude",
        "claude-code-plugin",
        "hybrid-search",
        "llm-memory",
        "long-term-memory",
        "mcp-server",
        "model-context-protocol",
        "rag",
        "semantic-search"
      ],
      "is_fork": false,
      "size_kb": 6527,
      "has_wiki": false,
      "homepage": null,
      "languages": {
        "Shell": 27892,
        "JavaScript": 4967644
      },
      "pushed_at": "2026-07-24T08:43:32Z",
      "created_at": "2026-02-08T07:10:37Z",
      "owner_type": "User",
      "updated_at": "2026-07-24T18:29:04Z",
      "description": "Persistent long-term memory for Claude Code via MCP — captures coding decisions, bugfixes, and context across sessions. Hybrid FTS5 + TF-IDF search with episode batching. Single SQLite DB, no external services. Alternative to claude-mem with 600x lower cost.",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "JavaScript",
      "significant_languages": [
        "JavaScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "User",
      "login": "sdsrss",
      "company": null,
      "location": null,
      "followers": 3,
      "avatar_url": "https://avatars.githubusercontent.com/u/230400260?v=4",
      "created_at": "2025-09-04T15:33:31Z",
      "is_verified": null,
      "public_repos": 12,
      "account_age_days": 333
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v3.59.1",
          "kind": "patch",
          "published_at": "2026-07-24T08:45:40Z"
        },
        {
          "tag": "v3.59.0",
          "kind": "minor",
          "published_at": "2026-07-24T08:10:37Z"
        },
        {
          "tag": "v3.58.2",
          "kind": "patch",
          "published_at": "2026-07-24T07:18:28Z"
        },
        {
          "tag": "v3.58.1",
          "kind": "patch",
          "published_at": "2026-07-24T06:43:34Z"
        },
        {
          "tag": "v3.58.0",
          "kind": "minor",
          "published_at": "2026-07-24T06:30:46Z"
        },
        {
          "tag": "v3.57.0",
          "kind": "minor",
          "published_at": "2026-07-24T05:29:41Z"
        },
        {
          "tag": "v3.56.1",
          "kind": "patch",
          "published_at": "2026-07-20T04:38:38Z"
        },
        {
          "tag": "v3.56.0",
          "kind": "minor",
          "published_at": "2026-07-20T04:21:57Z"
        },
        {
          "tag": "v3.55.0",
          "kind": "minor",
          "published_at": "2026-07-18T22:45:19Z"
        },
        {
          "tag": "v3.54.0",
          "kind": "minor",
          "published_at": "2026-07-18T22:26:53Z"
        },
        {
          "tag": "v3.53.0",
          "kind": "minor",
          "published_at": "2026-07-18T21:32:24Z"
        },
        {
          "tag": "v3.52.0",
          "kind": "minor",
          "published_at": "2026-07-18T21:17:58Z"
        },
        {
          "tag": "v3.51.0",
          "kind": "minor",
          "published_at": "2026-07-18T20:51:35Z"
        },
        {
          "tag": "v3.50.0",
          "kind": "minor",
          "published_at": "2026-07-18T20:01:34Z"
        },
        {
          "tag": "v3.49.0",
          "kind": "minor",
          "published_at": "2026-07-17T21:24:16Z"
        },
        {
          "tag": "v3.48.0",
          "kind": "minor",
          "published_at": "2026-07-17T01:16:05Z"
        },
        {
          "tag": "v3.47.0",
          "kind": "minor",
          "published_at": "2026-07-14T20:06:30Z"
        },
        {
          "tag": "v3.46.0",
          "kind": "minor",
          "published_at": "2026-07-13T22:00:47Z"
        },
        {
          "tag": "v3.45.0",
          "kind": "minor",
          "published_at": "2026-07-13T21:28:59Z"
        },
        {
          "tag": "v3.44.0",
          "kind": "minor",
          "published_at": "2026-07-13T20:43:22Z"
        },
        {
          "tag": "v3.43.0",
          "kind": "minor",
          "published_at": "2026-07-13T19:42:45Z"
        },
        {
          "tag": "v3.42.0",
          "kind": "minor",
          "published_at": "2026-07-06T18:26:27Z"
        },
        {
          "tag": "v3.41.0",
          "kind": "minor",
          "published_at": "2026-07-06T17:19:14Z"
        },
        {
          "tag": "v3.40.0",
          "kind": "minor",
          "published_at": "2026-07-06T16:07:53Z"
        },
        {
          "tag": "v3.39.2",
          "kind": "patch",
          "published_at": "2026-07-05T20:36:35Z"
        },
        {
          "tag": "v3.39.1",
          "kind": "patch",
          "published_at": "2026-07-05T19:46:10Z"
        },
        {
          "tag": "v3.39.0",
          "kind": "minor",
          "published_at": "2026-07-05T19:13:35Z"
        },
        {
          "tag": "v3.38.4",
          "kind": "patch",
          "published_at": "2026-07-05T17:41:00Z"
        },
        {
          "tag": "v3.38.3",
          "kind": "patch",
          "published_at": "2026-07-05T15:45:32Z"
        },
        {
          "tag": "v3.38.2",
          "kind": "patch",
          "published_at": "2026-07-05T07:36:46Z"
        },
        {
          "tag": "v3.38.1",
          "kind": "patch",
          "published_at": "2026-07-05T06:14:47Z"
        },
        {
          "tag": "v3.38.0",
          "kind": "minor",
          "published_at": "2026-07-04T10:09:52Z"
        },
        {
          "tag": "v3.37.0",
          "kind": "minor",
          "published_at": "2026-07-04T09:27:57Z"
        },
        {
          "tag": "v3.36.0",
          "kind": "minor",
          "published_at": "2026-07-04T07:47:05Z"
        },
        {
          "tag": "v3.35.2",
          "kind": "patch",
          "published_at": "2026-07-03T20:27:04Z"
        },
        {
          "tag": "v3.35.1",
          "kind": "patch",
          "published_at": "2026-07-03T19:16:59Z"
        },
        {
          "tag": "v3.35.0",
          "kind": "minor",
          "published_at": "2026-07-03T17:56:57Z"
        },
        {
          "tag": "v3.34.0",
          "kind": "minor",
          "published_at": "2026-07-03T15:07:59Z"
        },
        {
          "tag": "v3.33.1",
          "kind": "patch",
          "published_at": "2026-07-02T18:13:21Z"
        },
        {
          "tag": "v3.33.0",
          "kind": "minor",
          "published_at": "2026-07-02T17:21:45Z"
        },
        {
          "tag": "v3.32.0",
          "kind": "minor",
          "published_at": "2026-06-29T19:07:07Z"
        },
        {
          "tag": "v3.31.0",
          "kind": "minor",
          "published_at": "2026-06-29T18:53:36Z"
        },
        {
          "tag": "v3.30.0",
          "kind": "minor",
          "published_at": "2026-06-29T18:40:07Z"
        },
        {
          "tag": "v3.29.0",
          "kind": "minor",
          "published_at": "2026-06-29T18:24:06Z"
        },
        {
          "tag": "v3.28.3",
          "kind": "patch",
          "published_at": "2026-06-29T17:58:24Z"
        },
        {
          "tag": "v3.28.2",
          "kind": "patch",
          "published_at": "2026-06-29T17:34:49Z"
        },
        {
          "tag": "v3.28.1",
          "kind": "patch",
          "published_at": "2026-06-29T17:15:30Z"
        },
        {
          "tag": "v3.28.0",
          "kind": "minor",
          "published_at": "2026-06-29T16:18:51Z"
        },
        {
          "tag": "v3.27.0",
          "kind": "minor",
          "published_at": "2026-06-29T15:35:47Z"
        },
        {
          "tag": "v3.26.0",
          "kind": "minor",
          "published_at": "2026-06-29T15:08:22Z"
        },
        {
          "tag": "v3.25.0",
          "kind": "minor",
          "published_at": "2026-06-29T14:40:18Z"
        },
        {
          "tag": "v3.24.0",
          "kind": "minor",
          "published_at": "2026-06-29T13:46:26Z"
        },
        {
          "tag": "v3.23.0",
          "kind": "minor",
          "published_at": "2026-06-28T21:55:16Z"
        },
        {
          "tag": "v3.22.0",
          "kind": "minor",
          "published_at": "2026-06-28T20:26:10Z"
        },
        {
          "tag": "v3.21.0",
          "kind": "minor",
          "published_at": "2026-06-28T19:00:49Z"
        },
        {
          "tag": "v3.20.0",
          "kind": "minor",
          "published_at": "2026-06-28T18:23:16Z"
        },
        {
          "tag": "v3.19.0",
          "kind": "minor",
          "published_at": "2026-06-28T18:14:26Z"
        },
        {
          "tag": "v3.18.0",
          "kind": "minor",
          "published_at": "2026-06-26T23:36:13Z"
        },
        {
          "tag": "v3.17.0",
          "kind": "minor",
          "published_at": "2026-06-26T21:10:14Z"
        },
        {
          "tag": "v3.16.3",
          "kind": "patch",
          "published_at": "2026-06-26T19:05:16Z"
        },
        {
          "tag": "v3.16.2",
          "kind": "patch",
          "published_at": "2026-06-25T16:43:03Z"
        },
        {
          "tag": "v3.16.1",
          "kind": "patch",
          "published_at": "2026-06-25T16:24:41Z"
        },
        {
          "tag": "v3.16.0",
          "kind": "minor",
          "published_at": "2026-06-25T15:59:50Z"
        },
        {
          "tag": "v3.15.0",
          "kind": "minor",
          "published_at": "2026-06-25T14:37:31Z"
        },
        {
          "tag": "v3.14.0",
          "kind": "minor",
          "published_at": "2026-06-24T20:40:42Z"
        },
        {
          "tag": "v3.13.0",
          "kind": "minor",
          "published_at": "2026-06-24T18:50:14Z"
        },
        {
          "tag": "v3.12.1",
          "kind": "patch",
          "published_at": "2026-06-23T19:56:44Z"
        },
        {
          "tag": "v3.12.0",
          "kind": "minor",
          "published_at": "2026-06-23T18:47:01Z"
        },
        {
          "tag": "v3.11.0",
          "kind": "minor",
          "published_at": "2026-06-22T18:11:25Z"
        },
        {
          "tag": "v3.10.0",
          "kind": "minor",
          "published_at": "2026-06-22T16:10:00Z"
        },
        {
          "tag": "v3.9.1",
          "kind": "patch",
          "published_at": "2026-06-22T13:01:31Z"
        },
        {
          "tag": "v3.9.0",
          "kind": "minor",
          "published_at": "2026-06-22T12:34:38Z"
        },
        {
          "tag": "v3.8.0",
          "kind": "minor",
          "published_at": "2026-06-22T09:21:35Z"
        },
        {
          "tag": "v3.7.1",
          "kind": "patch",
          "published_at": "2026-06-22T08:12:33Z"
        },
        {
          "tag": "v3.7.0",
          "kind": "minor",
          "published_at": "2026-06-21T22:02:55Z"
        },
        {
          "tag": "v3.6.0",
          "kind": "minor",
          "published_at": "2026-06-21T16:52:55Z"
        },
        {
          "tag": "v3.5.0",
          "kind": "minor",
          "published_at": "2026-06-21T16:13:00Z"
        },
        {
          "tag": "v3.4.0",
          "kind": "minor",
          "published_at": "2026-06-21T14:27:02Z"
        },
        {
          "tag": "v3.3.1",
          "kind": "patch",
          "published_at": "2026-06-21T13:02:37Z"
        },
        {
          "tag": "v3.3.0",
          "kind": "minor",
          "published_at": "2026-06-21T07:50:53Z"
        },
        {
          "tag": "v3.2.0",
          "kind": "minor",
          "published_at": "2026-06-20T23:06:36Z"
        },
        {
          "tag": "v3.1.2",
          "kind": "patch",
          "published_at": "2026-06-20T19:16:12Z"
        },
        {
          "tag": "v3.1.1",
          "kind": "patch",
          "published_at": "2026-06-19T19:38:36Z"
        },
        {
          "tag": "v3.1.0",
          "kind": "minor",
          "published_at": "2026-06-19T18:09:13Z"
        },
        {
          "tag": "v3.0.1",
          "kind": "patch",
          "published_at": "2026-06-19T16:32:52Z"
        },
        {
          "tag": "v3.0.0",
          "kind": "major",
          "published_at": "2026-06-19T16:02:39Z"
        },
        {
          "tag": "v2.99.0",
          "kind": "minor",
          "published_at": "2026-06-12T22:05:08Z"
        },
        {
          "tag": "v2.98.0",
          "kind": "minor",
          "published_at": "2026-06-12T20:01:34Z"
        },
        {
          "tag": "v2.97.0",
          "kind": "minor",
          "published_at": "2026-06-09T18:17:54Z"
        },
        {
          "tag": "v2.96.0",
          "kind": "minor",
          "published_at": "2026-06-09T16:13:08Z"
        },
        {
          "tag": "v2.95.1",
          "kind": "patch",
          "published_at": "2026-06-09T15:44:00Z"
        },
        {
          "tag": "v2.95.0",
          "kind": "minor",
          "published_at": "2026-06-09T15:31:05Z"
        },
        {
          "tag": "v2.94.0",
          "kind": "minor",
          "published_at": "2026-06-08T18:02:59Z"
        },
        {
          "tag": "v2.93.0",
          "kind": "minor",
          "published_at": "2026-06-08T17:43:12Z"
        },
        {
          "tag": "v2.92.0",
          "kind": "minor",
          "published_at": "2026-06-04T18:28:08Z"
        },
        {
          "tag": "v2.91.0",
          "kind": "minor",
          "published_at": "2026-06-04T17:13:47Z"
        },
        {
          "tag": "v2.90.1",
          "kind": "patch",
          "published_at": "2026-06-03T19:06:14Z"
        },
        {
          "tag": "v2.90.0",
          "kind": "minor",
          "published_at": "2026-06-03T18:27:52Z"
        },
        {
          "tag": "v2.89.0",
          "kind": "minor",
          "published_at": "2026-06-02T23:53:48Z"
        },
        {
          "tag": "v2.88.0",
          "kind": "minor",
          "published_at": "2026-06-02T22:41:48Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "cf81df8d1b0ca9e24ccd4ad57449ddedf2bdd4af",
          "body": "…-type selection\n\nTwo audit fixes: notLowSignalTitleClause gains a lesson escape so\nlesson-bearing observations with LOW_SIGNAL-prefixed titles ('npm ...')\nare retrievable again (write/read gate symmetry); memdir-audit selects\nkebab-case memory files via frontmatter metadata.type, legacy prefixes\nke\n[…]\nly\nbuilder. Tests 4029 -> 4040, eslint clean, denoise-ab NEUTRAL with\nprobes 27/27, fresh-context pre-ship review: SHIP (no P1/P2, P3s -> D#13).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.59.1 — read-side lesson escape + memdir-audit frontmatter…",
          "author_name": "sds",
          "author_login": "sdsrss",
          "committed_at": "2026-07-24T08:43:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f36c278e8124c895b00c52942df2eebfdabbdff1",
          "body": "… now work\n\nEvery CLI command with a required positional now accepts the matching MCP\nfield name as a flag alias: save --text/--content, search --query,\nrecall --file, get/delete --ids, update --id, defer add --title,\ndefer drop --id. Root cause: LLM callers map the MCP tool schemas onto\nnamed flags\n[…]\n 4029 (+16), eslint clean, npm audit --omit=dev clean.\nPre-landing review (fresh-context subagent): no P1/P2, 3 P3 notes deferred.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.59.0 — MCP-field flag aliases: flags-only CLI invocations…",
          "author_name": "sds",
          "author_login": "sdsrss",
          "committed_at": "2026-07-24T08:08:26Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1c17e3b0cfb0a7f9322f37baf82afca8fa41ed2d",
          "body": "…v/CI-only)\n\nRuntime artifact identical to v3.58.1. Ships the smoke-npm12 CI job +\nsmoke-tarball heal/shrinkwrap assertions (commit 3a315ae) as a tagged\nrelease so the marketplace/auto-update line stays in step with main.\nFirst CI run confirmed: block occurred -> heal reported \"rebuilt\" ->\nre-probe passed.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.58.2 — CI regression net for the npm >= 12 heal chain (de…",
          "author_name": "sds",
          "author_login": "sdsrss",
          "committed_at": "2026-07-24T07:16:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3a315aec12eb1a4c791ce6915408069efdaa7cf5",
          "body": "…shipped heal must fix it\n\nThe whole v3.58.x self-heal chain targets npm >= 12's default script block,\nbut CI ran smoke-tarball only on npm 10 where compilation just works — a\nregression in the heal chain was invisible until a user-side -32000.\n\n- smoke-tarball.mjs: when the post-install binding pro\n[…]\nrified locally: normal run PASS unchanged; blocked simulation PASS via\n\"heal OK — ensureBetterSqlite3Working reported rebuilt\"; 4013/4013 tests.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: CI smoke leg for pristine npm >= 12 — script block must occur, …",
          "author_name": "sds",
          "author_login": "sdsrss",
          "committed_at": "2026-07-24T07:07:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8198e6442496f8ec802a13695ddabde199738146",
          "body": "… setup.sh\n\nTwo follow-ups to v3.58.0:\n\n- files[] now lists npm-shrinkwrap.json: both release jobs ran `npm shrinkwrap`\n  (CI logs confirm the rename) yet the published 3.58.0 tarball shipped without\n  it — with a files[] whitelist, npm 10's packlist drops the shrinkwrap unless\n  EXPLICITLY listed (\n[…]\nck-held)\n  re-verified after the refactor.\n\nknown-red baseline: main CI red is v3.58.0's shellcheck SC1123 on setup.sh — this commit is the fix.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.58.1 — pack the npm-shrinkwrap + fix shellcheck SC1123 on…",
          "author_name": "sds",
          "author_login": "sdsrss",
          "committed_at": "2026-07-24T06:41:01Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a6d0e6007f7aa2cdb124f93002a44a5368477845",
          "body": "…pdate-path binding gate, shared WAL recovery, locked rebuilds, unadopt residue sweep, shrinkwrapped registry installs\n\nSeven fixes from the install/update/self-heal/uninstall audit:\n- setup.sh probes the better-sqlite3 binding (ABI-keyed marker, locked 20s-bounded\n  rebuild, bare-probe fallback) in\n[…]\ned rows restored\nfrom the pre-maintain snapshot, 3 pollution rows removed).\n\n4013 tests (233 files, +7), eslint clean, smoke-tarball PASS local.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.58.0 — lifecycle audit batch: npm-12 hooks false-green, u…",
          "author_name": "sds",
          "author_login": "sdsrss",
          "committed_at": "2026-07-24T06:27:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3b00b3c7dfb601642992325a6a957580156d23e9",
          "body": "Five advisories published 07-20..07-24 against transitive deps in the MCP SDK's\nHTTP transport (unreachable — this plugin uses stdio). Pin patched versions via\noverrides, keeping @modelcontextprotocol/sdk at 1.29.0 (npm audit fix --force\nwould downgrade it to 1.24.3):\n  hono >=4.12.31, @hono/node-se\n[…]\nheld to 3.x (ajv ^3.0.1, reachable via schema validation). npm audit\n--omit=dev: 0 vulnerabilities. 4006 tests pass, eslint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump security overrides to clear npm audit gate (v3.57.0)",
          "author_name": "sds",
          "author_login": "sdsrss",
          "committed_at": "2026-07-24T05:23:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "564e63bc146dc6849bdb5432c41efb02800b5ba5",
          "body": "…ess, runtime hardening, data-layer atomicity\n\nLands the five-face audit (algo/security/data/prod/arch). No breaking changes.\n\n- algo: PRF emits FTS-matchable surface forms not porter stems (default-path recall\n  fix — observations_fts is unicode61/unstemmed); TF-IDF vocab rare-term quota;\n  cross-s\n[…]\ned-core (lib/recent-core.mjs); utils<->project-utils cycle broken.\n\n4006 tests (233 files), eslint clean, knip at 30-export floor.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.57.0 — multi-face audit batch: retrieval/scoring correctn…",
          "author_name": "sds",
          "author_login": "sdsrss",
          "committed_at": "2026-07-24T05:09:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "adc0e400a74f0bc5b348a385fd69f520c7cddbbc",
          "body": "…es (npm 10 array / npm 12 object)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.56.1 — smoke-tarball.mjs: parse both npm pack --json shap…",
          "author_name": "sds",
          "author_login": "sdsrss",
          "committed_at": "2026-07-20T04:36:19Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "9c8f4b63fc4251c1d17943d345982a2c5d3fd1fa",
          "body": "…default install-script block (fixes MCP -32000)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.56.0 — npm 12 self-heal: better-sqlite3 rebuild bypasses …",
          "author_name": "sds",
          "author_login": "sdsrss",
          "committed_at": "2026-07-20T04:19:34Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "63778162f783a0db112d915439021d8ac6cc430e",
          "body": "…+ events end-to-end probes\n\nG15: ~50 CJK<->EN synonym pairs (mined from 90d real prompts + memory/search/\nrelease domain vocab) bridge Chinese queries to English Haiku-summary bodies\n(live: '钳制' 0->31 hits). Same terms join CJK_COMPOUNDS so both tokenization\nsides agree. New cjk_xlang fixture face \n[…]\nts. Closes 07-17 MED-2 second half.\nG14 waits for pretool_recall metering data (threshold calibration).\n\n3913 tests (+3), eslint clean, knip 46.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.55.0 — audit Phase B (partial): bilingual synonym bridge …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-18T22:42:46Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "984b1ec655d8907459a3258d48c380dea81fab6a",
          "body": "…+ reminder counting fix + LongMemEval baseline refresh\n\nG13: enrich_save/pretool_recall/error_recall metric events + stats Recall\nmetering line (the three unmetered surfaces from the 2026-07-18 audit).\nG18: persist-reminder counts Skill lesson/memory/bug + memdir writes.\nG19: shared stdin-cap const\n[…]\n3.4/95.2/96.0 (engine-side real gain,\nharness/dataset unchanged; rerank row flagged as older-baseline).\n\n3910 tests (+4), eslint clean, knip 46.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.54.0 — three-face audit Phase A: recall/enrich telemetry …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-18T22:24:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fc8523256eea1b6afc7200bd3e3d50cd2c189fed",
          "body": "…decay undercount + superseded keeper credit\n\nD#60: applyCitationDecay idempotency key getSessionId (project-scoped, shared\nby concurrent sessions) -> CC session UUID from Stop stdin; second session's\ndecay pass no longer silently skips (e2e locks the shared-session-file repro).\nD#61: cited/injected\n[…]\nacked up): 12 test-residue deferred rows deleted, obs\n10084 re-homed super-skill--docs -> projects--super-skill.\n\n3906 tests (+5), eslint clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.53.0 — citation-metering fixes (G10): concurrent-session …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-18T21:29:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "053c4515b6b89ad112d57d775b6982d28a480e20",
          "body": "…ersisted-decision reminder\n\nG1+G2: manual saves (CLI+MCP) queue a detached Haiku worker distilling\nlesson_learned (obligated types) + search_aliases (every save), backfilled\nfill-only-empty under BEGIN IMMEDIATE; optimized_at untouched so daily\noptimize stays the backstop. Kill switch CLAUDE_MEM_SK\n[…]\n= ≤3/3459 rows (0.09%) ->\nG12②③ normalization not justified.\n\n3901 tests (+26), eslint clean. New shipped libs registered in files+SOURCE_FILES.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.52.0 — roadmap Phase 1: save-time enrichment worker + unp…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-18T21:15:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3ad88c162194d6125aed2d4e41e314554d03ed27",
          "body": "…ing + denoise blind-face probes + stats Data-dir\n\nG8: PostToolUse error-recall gate isError -> isHardError (loose gate fired\n\"Related memories found for this error\" on exit-0 commands, self-recursive;\n30d baseline 220 unique / 10.9% cite-recall). Episode isError semantics kept.\nG11: defer list rows\n[…]\ns prints \"Data dir:\" on both surfaces (D#92 wrong-path residue).\n\n3875 tests (+19), eslint clean. Roadmap: docs/记忆功能优化路线图-2026-07-18.md (local).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.51.0 — roadmap Phase 0: error-recall hard gate + defer ag…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-18T20:48:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e74e4ac1a0cbcd3f5f843043c0bff95b4c441592",
          "body": "…t + prompt injection + search (post-/clear D#92 gap)\n\ndeferred_work.detail was write-only: every surface (defer list / mem_defer_list\n/ dashboard) rendered title-only, no reader existed, search could not reach the\nrow. Three read paths open (write side needed no change):\n\n- get D#N (CLI+MCP): full \n[…]\nint clean. Verified against the\noriginating failure on the real DB: get D#92, the original prompt, and the\noriginal searches all reach the item.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.50.0 — D# read surface: deferred detail reachable from ge…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-18T19:58:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1c3b4d35a363bcb8d953d06260a479c8f1c796f6",
          "body": "…budget-1 boundary note on the adaptive alias split\n\nFresh-eyes review of 242a32e (0 Critical / 0 Important): knip count had\ndrifted (OBS_TYPE_ENUM gained importers in the same release that recorded\nthe baseline) and the adaptive-split comment overclaimed 'main keeps its\nfull budget' at the budget=1 boundary (pre-existing v3.43 semantics,\nmanual --max <=4 only). Comment/doc only, no behavior change, no bump.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: post-release review minors for v3.49.0 — knip baseline 47→46 + …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-17T21:36:55Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "242a32e8e303067b563aa654d5593352723b9ca7",
          "body": "…e ranking bands + save-time lesson nudge + alias-cadence fix + twin dedup\n\nFull audit of v3.48.0 (6 read-only agents): 0 HIGH, all seven v3.48.0 fixes\nheld. This release implements the complete recommendation roadmap:\n\n- MED-1+L3 (ranking): normalizeCrossSourceScores single-match clamp is now\n  ban\n[…]\nevents-injection path-A note, export-columns exclusions,\n  knip baseline.\n\n3819 tests (+21), eslint clean, knip 46, denoise NEUTRAL delta 0.000.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.49.0 — full audit 2026-07-17 roadmap (P1-P4): cross-sourc…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-17T21:21:34Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a397b4b9aa36c95120360cf8cb8c328d77f7844c",
          "body": "…defang (v3.48.0 review Minor #1/#3)\n\nPost-ship review hardening (no runtime behavior change, no version bump):\n- Two lock tests in citation-tracker-userprompt: a relevance=\"events\" block of\n  `- E#<id>` lines yields no extracted obs ids, and a mixed transcript where\n  observation #42 and event E#42\n[…]\ntableEvent documenting why row.type (frozen event_type\n  enum) is intentionally not defanged, so a future unvalidated event writer is\n  flagged.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: lock E# event-id isolation invariant + document event_type non-…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-17T01:30:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "51440dfa7047ddd0af6a371c4a78426f69694d88",
          "body": "…from passive injection (HIGH) + injection-defang/concurrency/latency/ranking/delete-twin\n\nHIGH-1: promoted memories (events table) were invisible to the 3 passive\ninjection surfaces since v3.44. New lib/events-injection.mjs feeds the\nUserPromptSubmit <memory-context> block (FTS-matched events) and \n[…]\n new runtime modules added to SOURCE_FILES + package.json files.\n3796 tests pass, eslint + shellcheck clean, denoise NEUTRAL (R@10 0.900/0.341).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.48.0 — full audit 2026-07-16 (7 fixes): events reachable …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-17T01:13:33Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e3aa8f49e261aa0e66dafeb612795e0299f70739",
          "body": "…ndary matching + per-edge citation decay + lesson scope labels\n\nTightens the PreToolUse file-triggered recall surface and adds a feedback loop so\nnoisy (observation, file) edges can go quiet without burying the lesson elsewhere.\n\n- P0: path-boundary file match (fixes utils.mjs pulling bash-utils.mj\n[…]\nte, plural\nself-heal sentinel. Schema auto-migrates 42→44 (additive; verified zero-loss on a\nproduction-DB copy). 3776 tests pass, eslint clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.47.0 — PreToolUse recall precision (D#78 P0–P3): path-bou…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-14T20:03:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "09c406c6491a3b4a76ed022937c8fae925e31b20",
          "body": "…e model stops probing the save format\n\nThe save CLI's hard constraints (--lesson ≤500, required positional <text>) lived only in the Zod\nschema + help output, invisible before the call — the model discovered the format by erroring. Same\npattern across every write command (defer add ≤200, update ≤50\n[…]\ncumented as a legacy MEMORY.md-sentinel cleanup sweep that does not adopt.\n\nFull suite 213 files / 3730 tests green, eslint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.46.0 — surface hidden CLI write-command constraints so th…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-13T21:58:21Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f679069d8226308c48694c606fd73368a6a53524",
          "body": "…4.0 feature (auto-deep drop, E# fetch/collision, obs_type→events)\n\nCode-review follow-ups to v3.44.0 \"events searchable via mem_search\" (D#74/75/76). TDD, +10 tests, 213 files / 3730 green, lint clean, verified end-to-end via CLI against a real file DB.\n\n- D#74: cross-source legs (sessions/prompts/\n[…]\nonors obs_type as event_type filter.\n- Changed: mem_search description + memGet/memTimeline schemas mention events / E#N (LLM-visible metadata).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.45.0 — events consumable: close 3 review gaps on the v3.4…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-13T21:26:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2a24fff041d5842c65bf429b557670c4a34030bd",
          "body": "…/decision history) + events_fts self-heal (schema v42) + P3 hardening batch\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.44.0 — events searchable via mem_search (canonical bugfix…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-13T20:40:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "db7bbb2fd5da435ea91a9e8d25b511ae70144bd0",
          "body": "…(RCE) + MCP export fidelity (data loss) + resolution/enrich/telemetry hardening\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.43.0 — full audit 2026-07-13 (8 fixes): launcher signing …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-13T19:40:27Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ce6c1ae54f3d864b81775fdf9fa24e55b1f8901b",
          "body": "…oS + Basic-auth leak), export/restore body fidelity, update/registry preserve-on-empty, retrieval fallback filter\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.42.0 — E2E audit round 4 (14 fixes): scrub hardening (ReD…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-06T18:23:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "ecc4729f8086518508010363e18f9d925aeac7b9",
          "body": "…, LLM-ops integrity, handoff scoping, vector-arm parity\n\nThird E2E audit round: 5 discovery agents over the vector, episode/handoff/session-lifecycle, LLM-ops, tier/context-injection, and install/update subsystems that rounds 1-2 hadn't covered. 14 bugs fixed TDD. 2 HIGH: isMemHook silently deleted\n[…]\npe. Full suite 203 files / 3654 tests green, eslint + shellcheck clean, denoise-A/B NEUTRAL (default lexical retrieval unchanged).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.41.0 — E2E audit round 3 (14 fixes): hook/settings safety…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-06T17:16:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7c443516888fd98af39492605b81730535983e9a",
          "body": "…eline, registry, release-signing, maintenance\n\nTwo-round end-to-end audit (6 parallel discovery agents + user-simulation testing) that found\nand fixed 14 real bugs across retrieval, secret handling, the resource registry, the\nrelease-signing chain, and the maintenance pipelines. Each fix TDD'd; 195\n[…]\npe, github default_branch, cross-hook dedup, maintain scan forecast,\nper-project normalize gate, …). Full details in CHANGELOG.md.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.40.0 — E2E audit (14 fixes): retrieval, secret-scrub, tim…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-06T16:05:11Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f792ca7f216a0d7766344a53819878a2029706fb",
          "body": "…save guard, multi-line save recognizer)\n\nThree fixes from a code review of the v3.39.0->v3.39.1 changeset. The review found\nno Critical issues and no data-corruption risk; these are the correctness/UX gaps\nit surfaced.\n\n- Vector text now includes lesson_learned + backfilled aliases (lib/save-observ\n[…]\nv3.39.1 FK-safe marking (superseded_by_id is left NULL, a self-FK to events(id)).\n\nTDD, full suite green (191 files / 3609 tests), eslint clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.39.2 — code-review follow-up (vector-arm parity, /lesson …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T20:34:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "900a03dcdbc33e034bad747bf0c3cab75024defe",
          "body": "… FK-safe marking)\n\nTwo fixes to `activity promote`, both caught running the v3.39.0 backfill on a real DB:\n\n- Low-signal exclusion: `body + importance>=2` was too loose (~17% Modified/Worked-on/\n  tool-log rows = the activity-log noise the events split contains). Now applies the\n  canonical notLowS\n[…]\ned_at_epoch only, wrap insert+mark per event in one\n  transaction (no orphan on failure), skip bad events. Test now runs PRAGMA foreign_keys=ON.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.39.1 — activity promote hardening (low-signal exclusion +…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T19:43:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "4d6c610595efe233158a9219d285df631b1305d4",
          "body": "…backfill, explicit supersession, searchable /bug /lesson)\n\nFrom a storage + retrieval + eval audit (2026-07-06). Lexical retrieval is\nalready strong (LongMemEval recall_any@5=95.2%), so the leverage is in what gets\nstored and whether it's reachable — not ranking. All TDD'd; 190 files / 3605 tests.\n\n[…]\nability: /bug /lesson write searchable observations (was the\n  events table mem_search never read); `activity promote` backfills insight events.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.39.0 — storage/retrieval precision (eval-coverage, alias …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T19:10:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "39a5753fb1899417d8d088fe01a41293855657e4",
          "body": "…urface drift guards\n\nAudit of the tool-guidance blocks found the always-injected MCP instructions field\n(INSTRUCTIONS_BASE in search-scoring.mjs) omitted the mem_defer/mem_defer_list/mem_defer_drop\ntrio that tools/list exposes and the adopt CLAUDE.md block + detail doc already reference\n(steering-s\n[…]\nthe instructions string is runtime-visible (next MCP server start); the rest is\ndocs/tests/comments. 187 files / 3580 tests green; eslint clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.38.4 — MCP instructions advertise defer trio + steering-s…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T17:38:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7a6cebe4508280ee60c8e61a780fa565860521de",
          "body": "… runtime unchanged)\n\nAdds benchmark/adoption-*.mjs (offline idiom-free adoption instrument) + 2 behavior-preserving shipped refactors (user-prompt-search.js searchByFts replay opts + isDirectInvocation guard; hook-memory.mjs rankImperativeCandidates extraction). Validated: action-channel hand-label\n[…]\n.698 [0.557, 0.747], P(AUC<=0.5)=0. Runtime unchanged vs 3.38.2 (verified against hook-launcher argv-rewrite + cache-buster path).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.38.3 — idiom-independent adoption benchmark (dev tooling;…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T15:38:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a9af62b3119e925c8a1d3037edf3c9425f58c14e",
          "body": "Whole-branch review M-2: this branch added the adoption benchmark suite\n(3452 -> 3577), so the Quick Reference count is corrected here.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs: sync CLAUDE.md test count to 187 files / 3577 tests",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T13:48:52Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d36759ab464b5951c50a4b09c7655642062922b4",
          "body": "…ssion + I-2/I-3/I-4 disclosures\n\nI-1 (shipped, must-fix): the Task-1 import guard evaluated false on the\nhook-launcher self-heal retry (imports with a ?t= cache-buster while argv[1] is\nquery-less), silently skipping main() -> no memory search on that fire. Fixed via\nan exported isDirectInvocation()\n[…]\nranker-selection-confounded for top-1 surfaces -> a GO\nmust rest on the floorCheck contrast + hand-label AUC, not effect+CI alone.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(bench+ups): address whole-branch review — I-1 shipped-guard regre…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T13:45:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1cba5fa561380d5a695097034d604b875ccebc76",
          "body": "Extends computeAdoption with collectEvents to emit per-event records from its own\nloop (RUN-WIDE IDF reused — actionDelta === the reported bucket effect, test-pinned).\nfloorCheck partitions events by cite-recall+ (assistant-authored #NN in PROSE, not\nthe raw file — the tautology fix: live citeSilent\n[…]\nputes rank-sum AUC of delta vs label. Completes the offline\nidiom-independent adoption instrument (GO/NO-GO adoption gate). 14/14.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bench): cite-recall floor check + hand-label emit/score harness",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T13:13:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "9e6ec2dc8883d41d4ee29150068e9239194148a1",
          "body": "placebo-random swaps each candidate's text for a deterministically-picked DB\nlesson (seeded lcg) -> collapses the per-event delta to chance -> the PRIMARY\neffect's ci95 brackets 0 (the key null). placebo-cutoff relabels the RDD points\nat the median running-var -> falsifies only the SECONDARY rdd_jum\n[…]\nts data). lcg\nexported from the estimator. Default (no-placebo) path unchanged by construction.\n5/5 overlap + 6/6 estimator tests.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bench): placebo-random + placebo-cutoff null controls",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T12:41:02Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "40fea24cf8578b37b121223367468eb9e6900710",
          "body": "…+ CI\n\nbenchmark/adoption-overlap.mjs wires replay->rankers->cosine->estimator: per\ninjection event, dual-channel (action/prose) cosine of the output window vs the\nshown vs near-miss candidates, control-subtracted, aggregated per surface:channel\nbucket with a session-cluster-bootstrap CI over a run-\n[…]\nsd centered on the bucket mean (honest mde), RDD\npoints one-per-candidate, read-only DB, guarded main(). 3/3 e2e, full suite 3562.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bench): adoption-overlap main -- per-bucket dual-channel effect …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T12:07:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "82865c0078cb58edaf9023c8b03955f6b614f086",
          "body": "benchmark/adoption-rankers.mjs re-runs the committed ranker seams under the\nevent's virtual clock/snapshot and splits candidates into shown vs near-miss:\nups-fts via searchByFts (|relevance| floor + MAX_RESULTS cap, extracted into a\npure splitShownNearMiss), imperative/subagent via rankImperativeCan\n[…]\nddle/exceeds-cap/below-floor fixtures, cutoffs read the same CLAUDE_MEM_UPS_*\nenv vars as production, unknown surface throws. 6/6.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bench): per-surface candidate replay (shown vs near-miss)",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T11:37:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0cafb73854e9614952323e0945916384fa2e0801",
          "body": "New self-contained statistical core (benchmark/adoption-estimator.mjs):\nlocalLinearRdd (jump = intercept difference at the cutoff; mean-diff fallback\nwhen a side has <2 distinct x), clusterBootstrap (session-clustered resampling\nvia a seeded LCG — deterministic, no Math.random), and mde. Review-hard\n[…]\nfault alpha/power); the RDD mean-diff fallback has\na discriminating regression test (proven to fail if the guard is removed). 6/6.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bench): RDD local-linear jump + session-cluster bootstrap + MDE",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T11:04:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f606c3af2a53a46da18865b9665b938b273f49af",
          "body": "…output window\n\nExtracts per-surface injection events (ups-fts/imperative/subagent) with the\nranker query, injected #NN ids, and an output window (prose vs actions) spanning\nthe injection to the next GENUINE user message. Review-hardened before commit:\ntool_result relay entries are not boundaries (i\n[…]\noutput), and\nparallel Agent/Task dispatch yields one event per subagent. 5/5 tests incl. 4\nrealistic-transcript regression guards.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bench): transcript replay -> injection events with dual-channel …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T10:20:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "f450d2fe8e9a33a5cde34f3ce1047b817ebfea67",
          "body": "…ption signal\n\nNew self-contained module (benchmark/adoption-cosine.mjs): IDF = log(1+N/(1+df))\nover a corpus, IDF-weighted cosine over the union vocab, and a dual-channel bag\nbuilder (action vs prose). Reuses only tfidf.mjs tokenize; zero new deps.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(bench): exact pairwise TF-IDF cosine + dual-channel bags for ado…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T09:43:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "8e7c9b757009b38d18f23bbe6681c08e54116a75",
          "body": "…electImperativeLesson wraps [0]\n\nExposes the full importance*overlap-scored candidate list (with an optional\nepochTo snapshot bound) so the adoption-overlap benchmark can recover the\nnear-miss candidates below the injected winner. selectImperativeLesson is now a\nthin [0] wrapper — behavior-preserving (all 6 filters, overlap basis, score, and\nargmax tie-break unchanged; full suite 3539/3539).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(imperative): extract rankImperativeCandidates scored list; s…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T09:32:54Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "2efb5a9ab00eb37253927fb09de0d3b6727d1f3a",
          "body": "… auto-run\n\nEnables faithful offline replay of the UserPromptSubmit ranker for the\nadoption-overlap benchmark: virtual clock (nowT) + created_at snapshot (epochTo)\n+ import guard so the module imports without firing main(). Behavior-preserving —\nexisting user-prompt-search suite 113/113 green.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(ups): add nowT/epochTo replay options to searchByFts + guard…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T09:12:56Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5874a807ea1b01d8dace684bad740aaf67ab16f2",
          "body": "…t injection (D#57)\n\ncitation-stats --sidechain was structurally blind to the dispatch-time subagent\ninjection surface (pre-agent-inject.js / CLAUDE_MEM_SUBAGENT_INJECT), which\nprompt-injects a lesson into each spawned subagent via updatedInput. The instrument\nonly scanned hook attachments (never pr\n[…]\ne in\n  mem-cli.mjs (the surface exists and injects).\n\nReal dogfood: sidechain 0/0 → 2/11 (18.2%). Suite 3531 → 3534, ESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.38.2 — sidechain cite-recall sees prompt-embedded subagen…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T07:34:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "18180a12092b8ca73cff1ba95e1c9462eefaed2c",
          "body": "…ction (D#51)\n\ncite-recall.mjs attributed PostToolUse:Bash injections by the loose [mem] text\nmarker + a broad /#\\d+\\b/ scan, not by the hook command the way production\nlib/citation-tracker.mjs does. Two artifacts, both deflating the channel's true\nrecall by padding its injected denominator with nev\n[…]\nst-tool-use.sh. Suite 3529 -> 3531.\n\nbenchmark/ is not shipped (not in package.json files) — dev instrument only,\nno version bump.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(benchmark): cite-recall :error-recall bucket + row-anchored extra…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T06:54:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "43b0ee0818719e79464e2ff67c3e5986e449a1e4",
          "body": "…x in citation-stats)\n\ncitation-stats' \"Cite rate by project\" reported cited_count/decay_seen_count over\nsurviving, in-window obs — doubly biased (GC drops uncited obs from the denominator;\nwindow excludes older obs), so a project could read 91% while its true lifetime\ninject->cite rate was ~6%. Now\n[…]\ncing-function that makes the model ACT on a lesson, not rank it better).\n\nSuite 3528 -> 3529 (+1 regression anchor), ESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.38.1 — honest per-project cite rate (survivorship-bias fi…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-05T06:12:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8da2613b7175c40ffc4f1a77d2ca61682c697d32",
          "body": "…de path)\n\nSplit the citation-decay promote-idempotency key into a new\nobservations.last_cited_session_id column (schema v41) so a #NN citation\nlanding in a LATER turn of the same session upgrades a previously-uncited\nobs instead of being frozen at the first Stop's verdict. The uncited/streak\nbranch\n[…]\ne old inj<=0 gate.\n\nSuite 3519 -> 3528 (+9), ESLint clean. v40->v41 migration verified zero-loss\non a 2097-row production DB copy.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.38.0 — cross-turn late-citation fix (citation-decay upgra…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-04T10:07:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6e31fe4c3598b546719e4283490ff18a081dda14",
          "body": "…rsarial-review-caught regressions)\n\nRound 5 of the real-user E2E audit: six parallel read-only auditors over the previously\nun-audited surface (CLI/MCP, schema, LLM ingestion, citation, text pipeline, mutation), then\ntwo independent adversarial reviewers over the whole diff before landing — which c\n[…]\nplugin.json + marketplace.json + CLAUDE.md\n→ 3.37.0. DB schema user_version 39 → 40. Suite 3482 → 3519 green, eslint + knip clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.37.0 — round-5 E2E audit (security + data-integrity, adve…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-04T09:25:35Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "33ac0f0dfb8592e8c5e125269ceef7e4802be1b7",
          "body": "… closures, injection/registry hardening)\n\nRound 4 (install / vectors / benchmark / semantic-inject audit) plus the security &\ndata-integrity fixes surfaced across all four rounds, and the v3.36.0 version bump.\nFull detail in CHANGELOG.md.\n\nSecurity / self-heal:\n- install.mjs repair(): resolve the l\n[…]\n.json + .claude-plugin/plugin.json +\n.claude-plugin/marketplace.json + CLAUDE.md → 3.36.0.\n\nSuite 3482 green, eslint + knip clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.36.0 — four-round E2E audit (self-heal signing, invariant…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-04T07:44:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "000a785c8184a63def8c4cb054b9e422ad6f1f0d",
          "body": "…ction/registry/context fixes\n\nThree rounds of real-user E2E auditing (parallel readers + runtime exercise).\nTwo invariants each gained a NEW enforcement-site fix (the audit's main line:\n\"some site has the guard\" never means \"all sites do\"):\n\n\"lessons never auto-GC\" (lesson-bearing rows excluded fro\n[…]\nment\n(5 -> 3); add benchmark/ups-ab.mjs to knip entry.\n\nNo version bump / release (commit-only). Suite green, eslint + knip clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: E2E audit rounds 1-3 — close parallel-path invariant gaps + inje…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-03T23:54:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b6625843d203c032eb4d006fae77c98ee5cf170",
          "body": "…e observations — v3.35.2\n\nTwo Claude Code sessions running in the SAME project directory shared one\nproject-keyed episode buffer (ep-${project}.json) and were summarized as one\nmerged episode. Now each buffered entry carries its CC session id and\nflushEpisode splits by session via a new pure planEp\n[…]\ntical; all four invariants verified). Tests: planEpisodeFlush\nunit matrix (7) + e2e tag/split/significance/receipt/same-file (5); suite -> 3469.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(episode): flush interleaved concurrent-session buffers as separat…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-03T20:23:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "64913cdcd8c46d2901e88b053d9cf251123d53a6",
          "body": "Route every CLAUDE_MEM_DIR consumer through lib/resolve-data-dir.mjs, a\nzero-dep pure resolver, replacing ~11 inline `env || join(HOME, ...)`\nfallbacks. The old pattern (a) accepted the literal strings \"undefined\"/\n\"null\" — produced when a caller interpolates a nullish JS value into a\nshell env stri\n[…]\n branch had;\nthe common unset case is unchanged (~/.claude-mem-lite).\n\nGate: eslint clean; vitest 176 files / 3458 passed (+6 resolve-data-dir).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(data-dir): centralize + validate CLAUDE_MEM_DIR resolution — v3.35.1",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-03T19:12:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2012955fddff3582f8e669b6650244b5ad1fe0b1",
          "body": "…tion fixes — v3.35.0\n\nHook & injection-layer audit (3 read-only auditors + adversarial review of every fix):\n- fix(citation-decay): IMPORTANCE_FLOOR 0->1 + recoverBuriedLessons maintain op —\n  decayed lessons were buried below the >=1 injection-visibility floor (one-way,\n  unrecoverable); recoverBu\n[…]\nxiting + EPIPE guard.\n- feat(metrics): bound the opt-in metrics JSONL log (gcOldMetricShards, 90d retention).\n\nSuite 3436 -> 3452, ESLint clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hooks): buried-lesson recovery + defang coverage + capture/injec…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-03T17:54:18Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bffa88ef82b907aba4fefd3cf4243477c16b50fe",
          "body": "…adow — v3.34.0\n\nfix(project-utils): resolveProject never tried an exact match, so a bare short project name (e.g. p) was shadowed by the %name% substring fallback and resolved to the biggest unrelated projects--* project, making it unreachable via --project across recent/search/timeline/stats/expor\n[…]\n-only and non-fatal, stdout/exit unchanged, zero false positives across all commands. +5 tests.\n\nSuite 3429 -> 3436, ESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): unknown-flag typo guard + fix resolveProject exact-name sh…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-03T15:05:32Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1a39ab86a425d661108d1d012fc15e5fd6598230",
          "body": "…ff the author's machine\n\nThe v3.33.1 Release CI went red: the spawn tests seeded --project projects--mem (hardcoded) but the script infers its project from CLAUDE_PROJECT_DIR = the checkout path. Only matched on the author's machine; CI's checkout path inferred a different name -> selectImperativeL\n[…]\nwn test THIS commit fixes; reproduced the CI condition locally (ambient CLAUDE_PROJECT_DIR=/home/runner/work/... -> 11/11 green) before pushing.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(test): pin project in pre-agent-inject spawn tests so they pass o…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-02T18:07:41Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d88a9487a5fc64d4b52bc175ce2e0d28da1547cb",
          "body": "…el tests — v3.33.1\n\nCode-review follow-up on v3.33.0. scripts/pre-agent-inject.js ended with process.exit(0), which on a pipe drops a pending async write and truncates the emitted JSON once the payload (it echoes the whole subagent prompt back via updatedInput) exceeds the ~64KB pipe buffer -> unpa\n[…]\n64KB round-trip guarding the flush). Also refreshes the stale CLAUDE.md test count. Feature stays default off. Suite 3424 -> 3429, ESLint clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hooks): flush stdout before exit in pre-agent-inject + script-lev…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-02T17:59:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fa196ec38b8360219e85872c21a9acb9f58bb3d2",
          "body": "…v3.33.0\n\nSubagents are memory-blind (plugin hooks don't fire inside them), so a spawned worker starts with zero project context even when the main session is memory-rich. A new PreToolUse:Agent|Task hook picks one relevant lesson (selectImperativeLesson: project-scoped, identifier-overlap, top-1) a\n[…]\nct.js; wired in hooks/hooks.json + install.mjs (parity) + source-files/package.json registration. 6 new tests; suite 3418 -> 3424, ESLint clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hooks): subagent dispatch-time memory injection (default off) — …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-02T17:19:14Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "786c4342390fd65f62dead3dafdf8452ff34f5c7",
          "body": "Non-isolated efficacy cells spawn 'claude -p' under the real ~/.claude, whose SessionStart auto-adopt wrote a sentinel into a throwaway worktree memdir that outlived the deleted worktree (~40 eff-wt residue dirs found in a 2026-07-03 audit). Set MEM_NO_AUTO_ADOPT=1 in the child env (gate at hook.mjs) so efficacy runs leave no ~/.claude/projects/*/memory residue.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore(benchmark): efficacy harness opts child sessions out of auto-adopt",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-07-02T17:17:32Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "aa60c6b5dd6097e7f5026d81096e2a65324de8bf",
          "body": "The CLI's `recent --type` had no MCP counterpart, so an agent asking for \"recent\nbugfixes\" had to over-fetch and filter client-side.\n\n- tool-schemas.mjs: memRecentSchema gains optional obs_type (OBS_TYPE_ENUM — an\n  unknown value is rejected by the schema before the handler, so no manual\n  validatio\n[…]\nhe bugfix row, discovery rows excluded).\n\nrelease: v3.32.0 — synced 5 version files + CHANGELOG. Suite 3416 -> 3418,\nESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): obs_type filter on mem_recent (closes CLI<->MCP parity gap)",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T19:01:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "73f466a99fc97e0059e7e252444bf4f2af757638",
          "body": "Mirrors v3.30.0's mem_search date_since on the recent surface, so the agent can\nask for \"everything since X\" (pair with a high limit).\n\n- tool-schemas.mjs: memRecentSchema gains optional date_since (opt-in; no default\n  behavior change — #8462)\n- server.mjs: extracted the inline mem_recent handler i\n[…]\nlid-duration\nexercised through the seam.\n\nrelease: v3.31.0 — synced 5 version files + CHANGELOG. Suite 3412 -> 3416,\nESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): date_since on mem_recent (completes agent --since parity)",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T18:48:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "6d076d2e47243c20fcbdbb3775e1f9b13537be3d",
          "body": "Brings v3.29.0's CLI --since to the MCP surface the agent actually calls.\nmem_search gains an optional date_since arg (7d|24h|90m|2w|30s) — the relative\ncomplement to date_from/date_to, so the agent can ask for \"recent\" memories\nwithout computing an absolute date.\n\n- tool-schemas.mjs: memSearchSchem\n[…]\n CLI id parity,\ninvalid 7days rejected).\n\nrelease: v3.30.0 — synced 5 version files + CHANGELOG. Suite 3410 -> 3412,\nESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(mcp): date_since on mem_search (agent parity with CLI --since)",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T18:34:13Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "67d89b0309c1509c199d7c6f18db944db48ca451",
          "body": "Adds `--since <duration>` (7d|24h|90m|2w|30s, case-insensitive, single unit) as\nthe relative complement to the absolute --from/--to. Users think in \"last week\",\nnot ISO dates: `search \"login bug\" --since 7d`, `recent 1000 --since 24h`.\n\nPurely additive — no existing behavior changes, retrieval ranki\n[…]\nrecedence +\ninvalid, recent --since e2e). release: v3.29.0 — synced 5 version files +\nCHANGELOG. Suite 3403 -> 3410, ESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(cli): --since relative time window for search and recent",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T18:18:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0319e082a8607c60a69654dff88a8fa5ee132ff9",
          "body": "Three positive hardenings, each behavior-neutral / additive with a RED->GREEN test:\n\n1. tier(fix): TIER_CASE_SQL's default-window fallthrough now guards on\n   (type IS NULL OR type NOT IN (6 known types)), mirroring computeTier's\n   `ACTIVE_WINDOWS[type] ?? DEFAULT`. Behavior-neutral today (all type\n[…]\nrse-file test.\n\nrelease: v3.28.3 — synced package/lock/plugin/marketplace/CLAUDE.md + CHANGELOG.\nSuite 3400 -> 3403, ESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "harden: tier JS<->SQL drift guard, tool-call tag defang, import size cap",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T17:52:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "40a73ba1094b816693d01d44e7b4bede24694765",
          "body": "…yed memory\n\nneutralizeContextDelimiters now strips the brackets on <system-reminder> and\n<task-notification> in addition to the three memory-block wrappers\n(claude-mem-context / memory-context / session-handoff).\n\nMemory replays arbitrary captured text (file contents, tool output, web pages),\nso a \n[…]\n on injection.\n\nrelease: v3.28.2 — synced package/lock/plugin/marketplace/CLAUDE.md + CHANGELOG.\nSuite 3399 -> 3400, ESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "change(security): defang forged harness-authority delimiters in repla…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T17:28:48Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "797382faef13015ac4c43577386f001acb4bd7f9",
          "body": "lib/rrf.mjs::rrfAccumulate summed 1/(k+rank+1) per-occurrence, so an id repeated\nwithin a SINGLE ranked list inflated to a fake cross-ranker-consensus score —\nviolating the documented \"across every ranked list it appears in\" contract.\nLatent today (both callers — tfidf.rrfMerge inputs and deep-searc\n[…]\nRED->GREEN test\nadded.\n\nrelease: v3.28.1 — synced package/lock/plugin/marketplace/CLAUDE.md + CHANGELOG.\nSuite 3399, ESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(rrf): count an intra-list duplicate id once at its best rank",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T17:09:31Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "aaaa4581e70c348494145128a3c75bdaa7a50aff",
          "body": "The scrubSecrets assignment-keyword regex only fires on a KEY=value value of\n>=6 chars (shorter values are left alone to avoid prose false-positives). Several\nsave/enrich/prompt paths truncated raw text FIRST and scrubbed the result, so a\nreal secret straddling the cut was sliced to a 1-5 char head \n[…]\nGREEN regression test (manual save, LLM episode/events, re-enrich,\nend-to-end user-prompt hook). Suite 3394 -> 3397, ESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(security): scrub secrets at full length before truncation",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T17:09:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5ee650d825c17d71a83c69670115c1153c079b8e",
          "body": "…ly on the re-rank path)\n\nPublishes the post-review follow-up already on main (506bc22): coreRunSearchPipeline now\nbuilds the obs-filtered list inside the doReRank branch, so the no-rerank path (deepReranked\n/ MCP isDeep+!ftsQuery) skips a wasted O(n) filter the markSuperseded deletion (v3.27.0)\nlef\n[…]\nst and the\nresult re-sort is unchanged. Also refreshed the internal knip baseline note 51->53 (no rot).\n\nSuite 3394, ESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.28.0 — search-pipeline micro-cleanup (obsResults built on…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T16:16:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "506bc22583763d2587f5d696959d80b926c97def",
          "body": "…sted filter (review minor #1)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "refactor(search): build obsResults only when doReRank fires — skip wa…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T16:11:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "bdd7ee3ed91e10d4e118739ef40a6f24fc2714c4",
          "body": "… rot)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(claudemd): refresh knip baseline 51→53 (2026-06-29 re-verify, no…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T15:48:28Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "e8eed57fd274529902fec05ea6f9bcafdfd37a04",
          "body": "…verlay on superseded_at)\n\nDelete the in-memory [SUPERSEDED] display tag from search/recent. It was a display-only\nfile-overlap + importance<= heuristic with no content check, layered on the real\nsuperseded_at mechanism (set by maintain/compress, which already excludes those rows from\nsearch) — so i\n[…]\neutral\n(53; the +2 vs the stale 2026-06-05 baseline of 51 is pre-existing drift, verified\nknip-neutral for this change via stash).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.27.0 — remove markSuperseded display heuristic (unsound o…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T15:33:16Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e8028161dd5473ad2cba867e6d1f5c3990430588",
          "body": "…T-POSITIVE via corrected ups-ab #8858)\n\nFlip CLAUDE_MEM_UPS_IDENTIFIER_BYPASS from opt-in to default-on (set =0 to disable).\n\nchange(ups): default-on identifier floor-bypass. Re-ran benchmark/ups-ab.mjs with\n  #8858-corrected hard-negatives (true off-topic FP isolated from on-topic eagerness\n  via \n[…]\nDE_MEM_TASK_IMPERATIVE stays default-OFF (its flip is gated on a live cite-recall\ncanary, not this A/B). Suite 3405, ESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.26.0 — identifier floor-bypass ON by default (measured NE…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T15:05:55Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d14bd437db00ee78e10f75796abf97070d922320",
          "body": "… CLI/hook fixes + markSuperseded review-correction)\n\nCode review of v3.24.0; every finding re-verified against the code before acting.\n\nfix(ups): stop-list prose phrases (up-to-date / macOS / state-of-the-art …) that\n  TECH_IDENTIFIER_RE structurally matched — they widened the default-ON\n  hasExpli\n[…]\ns; every\n  production obs row carries date, so the new sort is behavior-neutral hardening.\n\nSuite 3403 -> 3405 (+2), ESLint clean.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.25.0 — code-review follow-up (UPS prose-match precision +…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T14:37:58Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3154e0bd738ba4669cf404d5591162e1cb08c20b",
          "body": "…sk-imperative Phase-2 (default-off)\n\nAudit fixes (user-facing): markSuperseded false [SUPERSEDED] tag, parseGitHubUrl uppercase\nrejection, compress/optimize silent no-op on the sibling execute flag, pre-tool-recall\ninferProject PWD-fallback parity. Opt-in (default OFF): CLAUDE_MEM_UPS_IDENTIFIER_BY\n[…]\n and the task-imperative Phase-2 emitter\n(CLAUDE_MEM_TASK_IMPERATIVE) + cite-recall/denoise-ab instrumentation. Suite 3367 → 3403.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.24.0 — 6-round E2E audit fixes + UPS-path A/B harness; ta…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T13:43:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3e99e7e0f2f37830343b1f0e3b6b8dba911b8c34",
          "body": "…ss; docs(benchmark): denoise-ab scope\n\ndenoise-ab only drives searchObservationsHybrid (the CLI/MCP search path); it never executes\nuser-prompt-search.js, so the UPS injection levers (TOP_REL_FLOOR / OR_TOP_BM25_FLOOR /\ncite_factor / signal-gate) read NEUTRAL there regardless of effect (verified: e\n[…]\non the real corpus (+3 recall recoveries\n/ +4 on-topic-but-eager injections over 12 positives / 8 hard-negatives), so kept opt-in.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ups): identifier floor-bypass (default-off) + UPS-path A/B harne…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T13:30:23Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2b215a8da8a70efe0fce13014a8964c0a3c3f418",
          "body": "…ave path has\n\ninferProject is duplicated across utils.mjs (save path), the bash post-tool-use.sh fast-path,\nand pre-tool-recall.js (PreToolUse recall). pre-tool-recall resolved the dir from\nCLAUDE_PROJECT_DIR || process.cwd() WITHOUT the process.env.PWD fallback the other two have (and\nlacked the 1\n[…]\nlution order + sanitize + cap; add a\nSYNC comment. Latent in production (Claude Code sets CLAUDE_PROJECT_DIR, so all paths agree).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(hook): pre-tool-recall inferProject lacked the PWD fallback the s…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T13:29:49Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "5332ae8d359b3b8387761812682c385ca36a60da",
          "body": "… execute flag\n\nThe three mutating maintenance commands used three \"execute\" conventions: compress --execute,\noptimize --run, maintain positional `execute`. Borrowing a sibling's flag fell through to a\nsilent preview at exit 0, so a user who typed `optimize --execute` believed a mutation ran when\nit\n[…]\na pointer to their real flag when\nonly the sibling's flag is passed — parity with maintain, which already errored on a stray flag.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(cli): compress/optimize silently no-op'd on the sibling command's…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T13:29:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "8f0bd6d03f8f03e745cca94d8904d3b452d60ec8",
          "body": "Scheme + host were matched case-sensitively, so a pasted \"HTTPS://GitHub.com/owner/repo\"\n(RFC 3986-valid, opens in the browser) failed import with \"Invalid GitHub URL\". Normalize only\nthe scheme://github.com origin to lowercase before matching; the path (owner/repo/branch) stays\ncase-sensitive and t\n[…]\n unchanged, so the SSRF host-spoof guards\n(github.com.evil.com / github.com@evil.com) still reject — including uppercase variants.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(registry): parseGitHubUrl rejected valid uppercase GitHub URLs",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T13:28:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "7ce61b3f22120dae961014f32bbdee746d1af332",
          "body": "…t silently no-op'd in production\n\nThe recency sort keyed on r.date, but the production search pipeline (coreRunSearchPipeline →\nsearch-engine.mjs) supplies created_at / created_at_epoch and no `date`, so the localeCompare\nwas a no-op and a current, top-importance obs got a false [SUPERSEDED] tag. S\n[…]\ny-only (no recall/ranking impact). Unit\ntests passed because their fixtures supplied `date` — a test/production field-shape drift.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(search): markSuperseded read a missing `date` field — recency sor…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T13:28:17Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "edebaa0326c46d5d1ffc602d5566ccfa20e00faa",
          "body": "…r the co-located task-imperative line\n\nThe CLAUDE_MEM_TASK_IMPERATIVE line shares a UserPromptSubmit attachment with <memory-context>, so per-attachment routing folded its #NN into :memory-context. Split per-line into a distinct :imperative bucket + OR-gate the imperative-only case (#1501). Makes the dogfood canary (imperative cite-recall vs path-A/B baseline) measurable.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(benchmark): cite-recall :imperative bucket — per-line routing fo…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T09:51:01Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "87499fd65c6d9d5b230fd4993215e943ca187994",
          "body": "…_IMPERATIVE\n\nDogfooding sets the flag in .claude/settings.local.json, which Claude Code propagates into the test subprocess env; runUserPrompt spread ...process.env so the 'flag OFF' case inherited it. Clear it in the base env (like CLAUDE_MEM_HOOK_RUNNING) so the flag is opt-in per-test.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(hook): isolate task-imperative test from ambient CLAUDE_MEM_TASK…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T09:38:57Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "85bac7e5b9568a4f398988ea774a3accee96d488",
          "body": "…) — arm T was degenerate (== C) without it\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(efficacy): add aacab0c requirement (spelled-out superseded_at fix…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T09:17:36Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "3ed194c5771389d944f79797757c348ffa2fca41",
          "body": "… CLAUDE_MEM_TASK_IMPERATIVE (default off)\n\nShips lib/task-imperative.mjs in SOURCE_FILES + package.json files (new runtime import from hook.mjs).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hook): wire task-imperative emitter into UserPromptSubmit behind…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T09:05:04Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "40bf4461cea35ce1bc2c84d8c8b54d4715c741f5",
          "body": "… gate (Phase 2)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(hook): selectImperativeLesson — top-1 high-value relevant lesson…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T08:54:02Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "5e4ce3130a4fae06700d8f222be74579de59a672",
          "body": "…task-prompt 6-8/8 vs hook 0/8)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(efficacy): record arm-U task-imperative measure — NET-POSITIVE (…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-29T00:43:44Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "84d851fb8c9ad7d9b4cd5a20f7ef923fe279b9d6",
          "body": "…ed taskSuffixForArm\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(efficacy): add arm U (task-position memory-imperative) via unifi…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-28T23:48:11Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "f2ef14e01be16de25e0d7078797ce26eec00fe75",
          "body": "…+ Phase-2 emitter)\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(efficacy): pure task-imperative framing helper (shared by arm U …",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-28T23:44:39Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "d531da7bbd8364478383a7c12db6c331b627d015",
          "body": "…njection\n\nThe [mem]-only marker counted only path A (user-prompt-search.js \"[mem] FYI\")\nunder \"UserPromptSubmit\" and left path B (hook.mjs <memory-context>, which\ncarries no [mem] marker) invisible. Recognise <memory-context> and bucket it as\nUserPromptSubmit:memory-context so the two sibling UPS i\n[…]\n Lowest-cited injectors are PostToolUse:Bash (13.8%) and path A,\nNOT path B. Dev tooling — not in SOURCE_FILES, no release impact.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(benchmark): cite-recall now measures path B (<memory-context>) i…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-28T23:03:03Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "855b2226e549d145924a0004156a9695bfbbc6bb",
          "body": "Denoising levers shift precision (hard-negative suite) and recall\n(vocab-mismatch paraphrase suite) in OPPOSITE directions; evaluating one\nsuite alone hides the other side — that split let an OR-BM25 floor\nship-then-revert (2026-06-29). denoise-ab.mjs runs BOTH suites on the\nproduction-hybrid path a\n[…]\nare with a REJECT / TRADEOFF / NET-POSITIVE / NEUTRAL verdict.\n\nDev tooling only — not in SOURCE_FILES, no runtime/release impact.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test(benchmark): add denoise-ab precision↔recall tradeoff harness",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-28T22:57:53Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "bb849fe96ffe365e759e22f94e855d4e54ea3701",
          "body": "…e, change-aware bugfix nudge, lesson preservation, importance de-inflation\n\n3-pillar audit (injection/storage/retrieval, 3 parallel agents). Suite 3353→3367 (+14), ESLint clean.\n\n- fix(honesty): noise gauge sees imp=0 (importance<=1 + injection=0), CLI+MCP — live 0.0%→honest ~10-12%\n- fix(noise): b\n[…]\nicable commits 1→2\n\nLive maintenance pass: recovered 310 unreachable compression orphans + 64 buried lessons (snapshots retained).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.23.0 — injection/noise + storage audit: honest noise gaug…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-28T21:52:20Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "c0a191bef0d73899d9530de5aa5e4561fdadf0f3",
          "body": "… GC + CLI/hook robustness\n\nTwo-round real-user E2E bug-hunt (4 finder agents + per-bug reproduction). 15\nconfirmed bugs fixed across the CLI, MCP, and passive-hook paths. Suite 3339 →\n3353, ESLint clean, knip baseline unchanged. Recurring theme: §9 parallel-path\nmiss — the CLI/MCP maintenance paths\n[…]\nobject stdin; injected-context blocks defanged against delimiter tags.\n- session_handoffs: expired rows now GC'd in auto-maintain.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.22.0 — E2E user-sim audit: maintain data-loss fix + imp=0…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-28T20:23:56Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "a1e111481efc917e53ffd405ceefef9e96b3bc26",
          "body": "…an-safe purge)\n\n- feat(MED-2): VACUUM INTO snapshot before irreversible maintenance (auto-maintain\n  / CLI maintain / MCP mem_maintain), guarded on actual deletions, retain newest 3\n- feat(MED-5): post-install health gate — boot the switched code (cli help +\n  node --check) before discarding the ba\n[…]\n-backup.mjs (registered in source-files.mjs + package.json files).\nSuite 3330 -> 3339 (+9), ESLint clean, knip baseline unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.21.0 — maintenance-layer durability (MED-2 + MED-5 + orph…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-28T18:58:37Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "103e8011aaea2e045f2abf9708234d1e6ee90c19",
          "body": "Completes HIGH-1: embed the Ed25519 public key in hook-update.mjs so auto-update\nfails closed — a release missing/with-invalid signature assets is refused instead\nof installed opportunistically. Safe now: v3.19.0 was the first signed release and\nits published signature verified end-to-end against th\n[…]\nunaffected.\n\nAdds an embedded-key parse/reject regression lock; updates the default-regime test\nfrom opportunistic to fail-closed.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.20.0 — auto-update verifies release signatures (fail-closed)",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-28T18:20:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0df770aa8800b87d8292b8201fc180ee93109431",
          "body": "… signing activated\n\n4-agent production audit: engine held A- (no regression); fixed 3 HIGH in the\nperiphery + activated release signing.\n\n- fix(security): scrub events table at saveEvent choke-point (LLM + CLI writers)\n- fix(data): cluster-merge snapshots keeper original before in-place overwrite\n-\n[…]\nregistry busy_timeout 5000, golden decay axis, shadow-log 90d GC\n\nSuite 3317 -> 3329 (+12), ESLint clean, knip baseline unchanged.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.19.0 — security hardening from production audit + release…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-28T18:12:10Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "902930eb6731d4f63a3858f5ed20ab5f8bfbce7f",
          "body": "…ault off) + scoring-path golden lock\n\nfeat (opt-in, default OFF): CLAUDE_MEM_SALIENCE=bridge — PreToolUse rewrites a\nrecalled lesson into a check bound to the edit hunk via Haiku, fail-open to ack,\nLLM stack dynamic-imported only under the flag (fast-path unchanged).\n\nmeasured: B=0/8 vs T=8/8 (bac2\n[…]\ndrift-lock for the two scoring paths (ratio-isolation, mutation-\nverified). infra: efficacy harness arm B + ITT/fired-only deltas.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "release: v3.18.0 — opt-in comprehension-bridge FF (measured null, def…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-26T23:33:40Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "abde878b2ac9a0ec054d5be1eead4d85ec88401e",
          "body": "…n test\n\nAdds CLAUDE_MEM_SALIENCE=bridge (default OFF): PreToolUse rewrites a recalled\nlesson into a check bound to the edit hunk via Haiku, fail-open to ACK. Plus a\ngolden drift-lock for the two scoring paths, and efficacy harness arm B with\nITT/fired-only deltas.\n\nMEASURED OUTCOME (efficacy-README\n[…]\n step, not content specificity. Default unchanged;\nbridge stays opt-in. Next lever for D#44 is instruction/task-channel injection.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "merge: comprehension-bridge forcing-function (opt-in) + scoring golde…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-26T23:27:42Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d68a970867d9465defd8b12797a1d2bf0831e75a",
          "body": "Arm B (CLAUDE_MEM_SALIENCE=bridge) measured on bac2e85, k=8, sonnet-4-6,\nreusing cached A/C/F/T. Result: B=0/8 (Δ_ITT(B−C)=0pp) vs T=8/8.\n\nClean channel×specificity 2x2: the bridge's emitted check is ~content-identical\nto arm T's spelled-in requirement, so B-vs-T isolates delivery channel\n(PreToolUs\n[…]\nicity.\nExecutes #8771's 'add a forcing-function, re-run STEP 3' and refines its\nverdict. Do NOT flip default; bridge stays opt-in.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "docs(efficacy): record comprehension-bridge n=1 channel-isolation result",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-26T23:18:12Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "b2f1a34d944072e5ce5cc5feb17f30fa483beea0",
          "body": "Final-review finding (Important): the Phase-3 aggregation silently dropped\narm-B cells where the pre-session bridgeFired proxy was false, while leaving\narms A/C unfiltered. A non-fired bridge fails open to ACK (~arm A, scores ~0),\nso dropping those cells biased Δ(B−A)/Δ(B−C) optimistic — it could ma\n[…]\nd OPTIMISTIC Δ_fired(B−C)/Δ_fired(B−A) per-protocol\nsubset. bridgeFired + ⚠NOBRIDGE kept as diagnostics. Supersedes plan line 446.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix: report ITT + fired-only arm-B deltas (remove biased silent-drop)",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-26T22:44:27Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "badeb06c473e0453386cf71a99271b4c4f61de3e",
          "body": "Task 4. New pure module lib/efficacy-bridge-select.mjs:\n- lessonBindsToRegion(lesson, region): lesson identifier ∈ region (commit\n  selection — keep only commits the bridge can bind to, §4.2).\n- bridgeFired(out) / BRIDGE_MARKER: detect the '→ this edit must:' marker\n  pre-tool-recall emits (per-run \n[…]\n cells dropped → vacuous. Now feeds the fix-region diff as the Edit\nhunk so the probe exercises the real bridge gate + Haiku path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: efficacy arm-B selection + firing verification (Task 4)",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-26T22:28:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "440efdfe6737b95890c791d9a84efdd8db6cf9cc",
          "body": "…easure\n\nTask 3. Adds 'B' to INJECTED_ARMS and salience='bridge' to armConfig, so the\nsevere-test harness can run the bridge arm under CLAUDE_MEM_SALIENCE=bridge.\nController fix: restored the 6 pre-existing arm-semantics tests the worker\noverwrote (A/AL/F/C/T + exact-set), added B coverage, updated the exact-set\nassertion to {A,AL,B,F}.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: efficacy arm B (bridge salience) for the comprehension-bridge m…",
          "author_name": "sds.rs",
          "author_login": "sdsrss",
          "committed_at": "2026-06-26T22:14:51Z",
          "body_truncated": false,
          "is_coding_agent": true
        }
      ],
      "releases_count": 100,
      "commits_last_year": 829,
      "latest_release_at": "2026-07-24T08:45:40Z",
      "latest_release_tag": "v3.59.1",
      "releases_from_tags": false,
      "days_since_last_push": 10,
      "active_weeks_last_year": 24,
      "days_since_latest_release": 10,
      "mean_days_between_releases": 0.6
    },
    "artifacts": {
      "collected": true,
      "structure": [],
      "declarations": [
        {
          "name": "claude-mem-lite",
          "path": "package.json",
          "tokens": [
            "npm.bin"
          ],
          "ecosystem": "npm"
        }
      ]
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "readme_badges": {
        "hosts": [],
        "total": 0,
        "header": 0,
        "collected": true,
        "has_inspect_badge": false
      },
      "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": "claude-mem-lite",
          "exists": true,
          "license": null,
          "keywords": [],
          "ecosystem": "npm",
          "categories": [],
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/claude-mem-lite",
          "declared_type": null,
          "is_deprecated": false,
          "latest_version": "3.59.1",
          "repository_url": "https://github.com/sdsrss/claude-mem-lite",
          "versions_count": 252,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 8084,
          "first_published_at": "2026-02-13T18:17:41.945000Z",
          "latest_published_at": "2026-07-24T08:45:33.263000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 10
        }
      ]
    },
    "popularity": {
      "forks": 3,
      "stars": 49,
      "watchers": 0,
      "fork_history": {
        "days": [
          {
            "date": "2026-03-11",
            "count": 1
          },
          {
            "date": "2026-05-15",
            "count": 1
          },
          {
            "date": "2026-06-22",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 3,
        "total_forks": 3
      },
      "star_history": null,
      "open_issues_and_prs": 0
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [],
      "has_llms_txt": true,
      "has_dockerfile": false,
      "has_mcp_signal": true,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [],
      "toolchain_manifests": [],
      "largest_source_bytes": 164531,
      "source_files_sampled": 396,
      "oversized_source_files": 16,
      "agent_instruction_files": [
        "CLAUDE.md"
      ],
      "agent_instruction_max_bytes": 9548
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": "published_package",
        "source": "osv",
        "findings": [],
        "collected": true,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 130,
        "malicious_count": 0,
        "assessed_package": "npm:claude-mem-lite@3.59.1",
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [
        {
          "name": "@modelcontextprotocol/sdk",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^1.26.0"
        },
        {
          "name": "better-sqlite3",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^12.6.2"
        },
        {
          "name": "zod",
          "manifest": "package.json",
          "ecosystem": "npm",
          "version_constraint": "^4.3.6"
        }
      ],
      "all_dependencies": {
        "error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
        "source": null,
        "packages": [],
        "collected": false,
        "truncated": false,
        "total_count": null,
        "direct_count": null,
        "indirect_count": null
      }
    },
    "maintainership": {
      "issues": {
        "open_prs": 0,
        "merged_prs": 9,
        "open_issues": 0,
        "closed_ratio": 1,
        "closed_issues": 5,
        "closed_unmerged_prs": 1
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "sdsrss",
          "commits": 829,
          "avatar_url": "https://avatars.githubusercontent.com/u/230400260?v=4"
        }
      ],
      "contributors_sampled": 1,
      "top_contributor_share": 1
    },
    "quality_signals": {
      "has_ci": true,
      "has_tests": true,
      "ci_workflows": [
        "ci.yml",
        "publish.yml"
      ],
      "has_docs_dir": true,
      "linter_configs": [
        "eslint.config.mjs"
      ],
      "has_editorconfig": false,
      "has_linter_config": true,
      "has_precommit_config": false
    },
    "security_signals": {
      "lockfiles": [
        "package-lock.json"
      ],
      "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": null,
            "reason": "no pull request found",
            "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": 0,
            "reason": "project has 0 contributing companies or organizations -- score normalized to 0",
            "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 0 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": 5,
            "reason": "dependency not pinned by hash detected -- score normalized to 5",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "no SAST tool detected",
            "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": 8,
            "reason": "5 out of the last 5 releases have a total of 5 signed artifacts.",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": 0,
            "reason": "detected GitHub workflow tokens with excessive permissions",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 5,
            "reason": "5 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "cf81df8d1b0ca9e24ccd4ad57449ddedf2bdd4af",
        "ran_at": "2026-08-03T16:11:56Z",
        "aggregate_score": 4.4,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "recent_prs": {
        "merged_7d": 0,
        "decided_7d": 0,
        "merged_30d": 0,
        "authors_30d": 0,
        "decided_30d": 0,
        "sample_size": 10,
        "window_days": 30,
        "sample_exhausted": false,
        "authors_probed_30d": 0,
        "newcomer_merged_30d": 0,
        "bot_prs_excluded_30d": 0,
        "newcomer_authors_30d": 0,
        "newcomer_decided_30d": 0
      },
      "ci_last_run_at": "2026-07-24T08:45:45Z",
      "oldest_open_prs": [],
      "last_merged_pr_at": "2026-03-28T10:14:40Z",
      "ci_last_conclusion": "SUCCESS",
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/sdsrss/claude-mem-lite",
    "host": "github.com",
    "name": "claude-mem-lite",
    "owner": "sdsrss"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "good",
      "name": "Overall health",
      "note": "The weighted overall 63 is calibrated to 71 on the published index scale (record calibration 2026-08-02).",
      "notes": [
        {
          "code": "overall_calibration",
          "params": {
            "raw": 63,
            "calibrated": 71,
            "calibration": "2026-08-02"
          }
        }
      ],
      "value": 71,
      "inputs": {
        "security": 55,
        "vitality": 83,
        "community": 46,
        "governance": 50,
        "calibration": "2026-08-02",
        "engineering": 78,
        "ai_readiness": 64,
        "weighted_overall_raw": 63
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "excellent",
        "name": "Vitality",
        "value": 83,
        "weight": 0.21,
        "metrics": [
          {
            "key": "development_activity",
            "band": "good",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 73,
            "inputs": {
              "commits_last_year": 829,
              "human_commit_share": 1,
              "days_since_last_push": 10,
              "active_weeks_last_year": 24
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 10 days ago",
                "points": 28.8,
                "status": "partial",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "24/52 weeks with commits",
                "points": 16.6,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 24
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "829 commits in the last year",
                "points": 18,
                "status": "met",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 829
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "30 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 10",
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "exceptional",
            "name": "Release discipline",
            "note": null,
            "notes": [],
            "value": 98,
            "inputs": {
              "releases_count": 100,
              "latest_release_tag": "v3.59.1",
              "releases_from_tags": false,
              "days_since_latest_release": 10,
              "mean_days_between_releases": 0.6
            },
            "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 10 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 10
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~0.6 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 0.6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 8,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "exceptional",
            "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": "weak",
        "name": "Community & Adoption",
        "value": 46,
        "weight": 0.17,
        "metrics": [
          {
            "key": "popularity",
            "band": "at_risk",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 30,
            "inputs": {
              "forks": 3,
              "stars": 49,
              "watchers": 0,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "49 stars",
                "points": 27.3,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 49
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "3 forks",
                "points": 2.5,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 3
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "0 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 0
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "readme_badges": 0,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "readme_badge_services": [],
              "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": "good",
            "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": 65,
            "inputs": {
              "packages": [
                "claude-mem-lite"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 8084
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "8,084 downloads/month across npm",
                "points": 52.1,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 8084,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "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": 50,
        "weight": 0.23,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 10,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 1,
              "top_contributor_share": 1
            },
            "components": [
              {
                "key": "bus_factor",
                "name": "Bus factor",
                "detail": "1 contributor(s) cover half of all commits",
                "points": 9,
                "status": "partial",
                "details": [
                  {
                    "code": "bus_factor",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 54
              },
              {
                "key": "commit_distribution",
                "name": "Commit distribution",
                "detail": "top contributor authored 100% of commits",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "1 contributors",
                "points": 1.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "good",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Newcomer PR acceptance. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "newcomer_pr_acceptance"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 79,
            "inputs": {
              "merged_prs": 9,
              "open_issues": 0,
              "closed_issues": 5,
              "prs_merged_7d": 0,
              "prs_decided_7d": 0,
              "prs_merged_30d": 0,
              "prs_decided_30d": 0,
              "issue_closed_ratio": 1,
              "closed_unmerged_prs": 1,
              "first_time_authors_30d": 0,
              "first_time_prs_merged_30d": 0,
              "first_time_prs_decided_30d": 0
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "100% of issues closed",
                "points": 42,
                "status": "met",
                "details": [
                  {
                    "code": "issues_closed_share",
                    "params": {
                      "share": 100
                    }
                  }
                ],
                "max_points": 42
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "9/10 decided PRs merged",
                "points": 27,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 9,
                      "decided": 10
                    }
                  }
                ],
                "max_points": 30
              },
              {
                "key": "newcomer_pr_acceptance",
                "name": "Newcomer PR acceptance",
                "detail": "no first-time contributor's PR decided in 30d",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_newcomer_prs",
                    "params": {
                      "days": 30
                    }
                  }
                ],
                "max_points": 13
              },
              {
                "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": "at_risk",
            "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": 30,
            "inputs": {
              "followers": 3,
              "owner_type": "User",
              "is_verified": null,
              "owner_login": "sdsrss",
              "public_repos": 12,
              "account_age_days": 333
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "personal (user) account",
                "points": 10,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_personal",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": "not applicable to user accounts",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "not_applicable_to_user_accounts",
                    "params": {}
                  }
                ],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "3 followers of sdsrss",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3,
                      "login": "sdsrss"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "12 public repos, account ~0 yr old",
                "points": 9.9,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 12
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 0
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "exceptional",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "claude-mem-lite"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 10
            },
            "components": [
              {
                "key": "published_resolvable",
                "name": "Published & resolvable",
                "detail": "1 package(s) on npm",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "packages_published",
                    "params": {
                      "count": 1,
                      "ecosystems": "npm"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "publish_recency",
                "name": "Publish recency",
                "detail": "latest publish 10 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 10
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "252 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 252
                    }
                  }
                ],
                "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": 78,
        "weight": 0.19,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "excellent",
            "name": "Engineering practices",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 80,
            "inputs": {
              "has_ci": true,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": true,
              "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": "eslint.config.mjs",
                "points": 16,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "good",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 75,
            "inputs": {
              "topics": [
                "claude-code",
                "fts5",
                "hooks",
                "mcp",
                "memory",
                "persistence",
                "sqlite",
                "agent-memory",
                "ai-coding-assistant",
                "ai-memory",
                "anthropic",
                "claude",
                "claude-code-plugin",
                "hybrid-search",
                "llm-memory",
                "long-term-memory",
                "mcp-server",
                "model-context-protocol",
                "rag",
                "semantic-search"
              ],
              "has_wiki": false,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": true,
              "has_description": true
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 30,
                "status": "met",
                "details": [],
                "max_points": 30
              },
              {
                "key": "documentation_directory",
                "name": "Documentation directory",
                "detail": null,
                "points": 25,
                "status": "met",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": "20 topics",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "topics_count",
                    "params": {
                      "count": 20
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "moderate",
        "name": "Security",
        "value": 55,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "weak",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): CI-Tests. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "ci_tests"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 44,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 17,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 1,
              "scorecard_aggregate": 4.4
            },
            "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": "no pull request found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "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 0 contributing companies or organizations -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "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 0 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 5",
                "points": 2.5,
                "status": "partial",
                "details": [],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "no SAST tool detected",
                "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": "5 out of the last 5 releases have a total of 5 signed artifacts.",
                "points": 6,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "detected GitHub workflow tokens with excessive permissions",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "5 existing vulnerabilities detected",
                "points": 3.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          },
          {
            "key": "dependency_advisories",
            "band": "exceptional",
            "name": "Dependency advisories",
            "note": "Excluded from scoring (no data or not applicable): No advisories left outstanding. Remaining weights renormalized. Matched the npm:claude-mem-lite@3.59.1 runtime dependency closure — what installing the published package pulls in — 130 packages. Reachability is not analyzed.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "no_advisories_left_outstanding"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              },
              {
                "code": "advisories_scope_published",
                "params": {
                  "package": "npm:claude-mem-lite@3.59.1",
                  "assessed": 130
                }
              },
              {
                "code": "advisories_reachability",
                "params": {}
              }
            ],
            "value": 100,
            "inputs": {
              "source": "osv",
              "advisories": 0,
              "affected_packages": 0,
              "assessed_packages": 130,
              "unassessed_packages": 0,
              "affected_by_severity": "none",
              "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": "no indirect dependency carries a known advisory",
                "points": 25,
                "status": "met",
                "details": [
                  {
                    "code": "no_indirect_advisories",
                    "params": {}
                  }
                ],
                "max_points": 25
              },
              {
                "key": "no_advisories_left_outstanding",
                "name": "No advisories left outstanding",
                "detail": "no advisory carries a publication date",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "advisories_no_publication_date",
                    "params": {}
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "malicious_dependencies",
            "band": "exceptional",
            "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": 130,
              "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
              }
            ]
          }
        ],
        "description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
      },
      {
        "key": "ai_readiness",
        "band": "moderate",
        "name": "AI Readiness",
        "value": 64,
        "weight": 0.04,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "exceptional",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "has_llms_txt": true,
              "legible_history_share": 1,
              "agent_instruction_files": [
                "CLAUDE.md"
              ],
              "agent_instruction_max_bytes": 9548
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "CLAUDE.md",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "CLAUDE.md"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": "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": 58,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": false,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": true,
              "typecheck_configs": [],
              "agent_commit_share": 1,
              "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": "eslint.config.mjs",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "eslint.config.mjs"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "100 of the last 100 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 100,
                      "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 5",
                "points": 5,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "moderate",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 53,
            "inputs": {
              "primary_language": "JavaScript",
              "largest_source_bytes": 164531,
              "source_files_sampled": 396,
              "oversized_source_files": 16
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "JavaScript without a type-check config",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_typecheck_config_language",
                    "params": {
                      "language": "JavaScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "16/396 source files over 60KB",
                "points": 52.8,
                "status": "partial",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 396,
                      "oversized": 16
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 20,
            "inputs": {
              "example_dirs": [],
              "has_mcp_signal": true,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 20,
                "status": "met",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
      }
    ],
    "classification": {
      "top": [
        "library",
        "application"
      ],
      "labels": [
        "cli",
        "mcp-server",
        "library"
      ],
      "scores": {
        "cli": 10,
        "library": 6,
        "mcp-server": 9
      },
      "primary": "cli",
      "evidence": [
        {
          "tier": "declared",
          "label": "cli",
          "source": "npm.bin",
          "weight": 10
        },
        {
          "tier": "distribution",
          "label": "library",
          "source": "registry:npm",
          "weight": 6
        },
        {
          "tier": "dependencies",
          "label": "mcp-server",
          "source": "dep:@modelcontextprotocol/sdk",
          "weight": 4
        },
        {
          "tier": "structure",
          "label": "mcp-server",
          "source": "mcp_signal",
          "weight": 3
        },
        {
          "tier": "tags",
          "label": "mcp-server",
          "source": "tag:mcp-server",
          "weight": 2
        }
      ],
      "artifacts": [
        {
          "path": "package.json",
          "labels": [
            "cli"
          ],
          "ecosystem": "npm"
        }
      ],
      "confidence": "high",
      "host_extension": false,
      "runs_as_process": true,
      "consumed_by_code": true
    },
    "metrics_version": "2.5.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-08-03T16:12:04.323505Z",
  "schema_version": "0.30.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/s/sdsrss/claude-mem-lite.svg",
  "full_name": "sdsrss/claude-mem-lite",
  "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 v2.5.0, schema v0.30.0 — full methodology · metrics wiki.

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