公开记录
软件健康报告模式 0.27.0 · 指标 1.13.0 · 2026-07-23 06:40 UTC

XTraceAI / memory-sdk-ts

TypeScript SDK for the xtrace memory API

TypeScriptMIT★ 274 星标⑂ 34 复刻始于 2026年5月在 GitHub 上查看 ↗

XTraceAI/memory-sdk-ts 的健康指数为 100 分中的 47 分,处于「存在风险」区间。 其得分最高的类别是Vitality(70/100),最低的是Security(17/100)。 最近一次更新在 5 天前。 近期的大部分工作由 1 位贡献者完成。

47
总分 / 100
存在风险

软件健康指数

指标归入加权类别,统一采用 1–100 量表。总体分先取类别加权平均;当公开证据触发高风险司法辖区政策时,评级会按政策调整,并设置 49(有风险)的上限。AI 就绪度不计入总体分。

47
优秀85-100堪称典范;基本满足所有检验标准
良好70-84健康;仅有轻微不足
中等50-69可接受,但存在明显不足;建议进行审查
存在风险30-49存在重大薄弱环节;采用时应保持审慎
危急1-29问题严重(项目被弃置、仅有单一维护者、缺乏基本工程规范)
活力社区与采用可持续性与治理工程质量安全AI 就绪度

评分画像

每条轴代表一个类别。形状比平均值更重要——健康的对象会填满整个图形,而“一峰一谷”式画像意味着某一维度的优势正掩盖另一维度的风险。

所有权

XTraceAI组织
3 关注者6 个公开仓库始于 2024年5月

该仓库由组织支持——共同承担、可问责的托管责任,可延续于任何单一维护者之后。

软件包生态系统

注册表软件包版本月下载量版本数最近发布标签
npm@xtraceai/memory0.5.05,02495 天前xtracememorysdkaiagentai-sdkvercel-ai-sdk

按类别列示的指标

活力

项目是否仍有生命——是否仍在编写代码,是否仍在发布版本?

70良好 · 占总体的 22%
评分方式
36/36推送新近度 — 最近一次推送于 5 天前
5.5/36提交节奏 — 52 周中有 8 周有提交
16/18提交量 — 最近一年 60 次提交
0/10OpenSSF Scorecard:Maintained — project was created within the last 90 days. Please review its contents carefully
所用输入
commits_last_year60
human_commit_share1
days_since_last_push5
active_weeks_last_year8

发布纪律

88优秀
评分方式
16.2/27有发布版本 — 6 个版本标签(无 GitHub 发布版本)
36/36发布时效 — 最近一次发布版本于 5 天前
27/27发布节奏 — 约每 10.2 天发布一次
0/10OpenSSF Scorecard:Signed-Releases — 无数据
所用输入
releases_count6
latest_release_tagv0.5.0
releases_from_tags
days_since_latest_release5
mean_days_between_releases10.2
已排除计分(无数据或不适用):OpenSSF Scorecard:Signed-Releases。 其余权重已重新归一化。

社区与采用

项目是否拥有用户、下载量与关注度,并具备欢迎贡献者参与的配置?

54中等 · 占总体的 18%
评分方式
39.5/60星标 — 274 个星标
12.7/25复刻 — 34 个复刻
0/15关注者 — 1 位关注者
所用输入
forks34
stars274
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history

社区健康

50中等
评分方式
22.5/22.5README
22.5/22.5许可证 — 可识别的许可证(MIT)
0/18CONTRIBUTING 指南
0/13.5行为准则
0/7.2议题模板
0/6.3PR 模板
所用输入
has_readme
has_license
has_contributing
has_issue_template
has_code_of_conduct
has_pull_request_template
评分方式
49.3/80月度下载量 — npm 合计每月 5,024 次下载
0/20注册表被依赖数 — 该生态系统不报告此项
所用输入
packages@xtraceai/memory
dependents
ecosystemsnpm
total_downloads
monthly_downloads5,024
已排除计分(无数据或不适用):注册表被依赖数。 其余权重已重新归一化。

可持续性与治理

项目能否在其成员之外延续——巴士系数、响应能力、由谁支持,以及软件包的维护状况?

51中等 · 占总体的 24%
评分方式
9/54巴士系数 — 1 位贡献者贡献了半数提交
4.5/22.5提交分布 — 头号贡献者编写了 80% 的提交
5.4/13.5贡献者广度 — 4 位贡献者
3/10OpenSSF Scorecard:Contributors — project has 1 contributing companies or organizations -- score normalized to 3
所用输入
bus_factor1
contributors_sampled4
top_contributor_share0.8
评分方式
0/46.8议题解决 — 没有议题或无数据
27.3/38.3PR 接受 — 已裁定的 PR 中 10/14 已合并
0/15OpenSSF Scorecard:Code-Review — Found 0/9 approved changesets -- score normalized to 0
所用输入
merged_prs10
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs4
已排除计分(无数据或不适用):议题解决。 其余权重已重新归一化。
评分方式
30/30所有权背书 — 组织持有
0/20已验证域名
4.3/25所有者影响力 — XTraceAI 有 3 位关注者
10.5/25既往记录 — 6 个公开仓库,账户约 2 年
所用输入
followers3
owner_typeOrganization
is_verified
owner_loginXTraceAI
public_repos6
account_age_days786
评分方式
25/25已发布且可解析 — npm 上有 1 个软件包
35/35发布时效 — 最近一次发布于 5 天前
20/20版本历史 — 9 个已发布版本
20/20未被弃用 — 活跃,未被弃用或撤回
所用输入
packages@xtraceai/memory
ecosystemsnpm
any_deprecated
min_days_since_publish5

工程质量

基础的工程与文档实践是否到位?

34存在风险 · 占总体的 20%

工程实践

24危急
评分方式
0/24CI 工作流
24/24存在测试
0/16Linter 配置
0/9.6Pre-commit 钩子
0/6.4.editorconfig
0/20OpenSSF Scorecard:CI-Tests — 0 out of 5 merged PRs checked by a CI test -- score normalized to 0
所用输入
has_ci
has_tests
has_editorconfig
has_linter_config
has_precommit_config

文档

50中等
评分方式
30/30README
0/25文档目录
0/15文档 / 主页站点
10/10仓库描述
0/10主题标签
10/10Wiki
所用输入
topics
has_wiki
homepage
has_readme
has_docs_dir
has_description

安全

可见的安全与供应链实践是否稳固,且不存在未解决的高风险司法辖区暴露?

17危急 · 占总体的 16%

安全态势

17危急
评分方式
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 — 0 out of 5 merged PRs checked by a CI test -- score normalized to 0
0/2.5CII-Best-Practices — no effort to earn an OpenSSF best practices badge detected
0/7.5Code-Review — Found 0/9 approved changesets -- score normalized to 0
0.8/2.5Contributors — project has 1 contributing companies or organizations -- score normalized to 3
0/10Dangerous-Workflow — 无数据
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5许可证 — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — 无数据
0/5Pinned-Dependencies — 无数据
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — 无数据
0/7.5Token-Permissions — 无数据
0.8/7.5Vulnerabilities — 9 existing vulnerabilities detected
所用输入
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate1.6
已排除计分(无数据或不适用):dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions。 其余权重已重新归一化。

AI 就绪度

该仓库在多大程度上具备与 AI 编码代理协同开发与维护的条件?这是一枚独立的实验性徽章——权重为 0.0,因此单独呈现,不影响总体健康评分。

57中等 · 占总体的 0%
评分方式
0/45代理指令 — 没有 CLAUDE.md / AGENTS.md / 编辑器规则
0/15机器可读文档(llms.txt)
40/40可读的提交历史 — 60 次人类提交中有 56 次说明了意图(结构化标题或解释性正文)
所用输入
has_llms_txt
legible_history_share0.933
agent_instruction_files
agent_instruction_max_bytes
评分方式
0/18一条命令的引导启动
22/22自动化测试
0/11Lint / 格式化配置
11/11静态类型检查 — tsconfig.json
10/10可复现环境 — lockfile
10/10已体现的代理实践 — 最近 60 次提交中有 22 次由代理编写或署名代理
0/8自动化维护 — 未观察到自动依赖更新
0/10OpenSSF Scorecard:Pinned-Dependencies — 无数据
所用输入
has_nix
has_tests
lockfilespackage-lock.json
has_dockerfile
typed_language
bootstrap_files
has_devcontainer
has_linter_config
typecheck_configstsconfig.json
agent_commit_share0.367
toolchain_manifests
dependency_bot_commit_share0
已排除计分(无数据或不适用):OpenSSF Scorecard:Pinned-Dependencies。 其余权重已重新归一化。
评分方式
45/45可类型检查的代码 — TypeScript(静态类型)
55/55可控的文件大小 — 采样的 22 个源文件中有 0 个超过 60KB
所用输入
primary_languageTypeScript
largest_source_bytes23,316
source_files_sampled22
oversized_source_files0

机器可读接口

40存在风险
评分方式
0/40API 模式(OpenAPI/GraphQL/proto)
0/20MCP 服务器
40/40可运行示例 — examples
所用输入
example_dirsexamples
has_mcp_signal
api_schema_files

关键数据

274GitHub 星标
4贡献者
60最近 12 个月提交数
5距最近推送天数
6发布版本数
1巴士系数(bus factor)
0开放议题
npm软件包生态系统数

数据采集警告

  • Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token
  • GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository
  • deps.dev does not index npm:@xtraceai/memory@0.5.0; advisories assessed against the repository dependency graph instead

更多细节

Star 与 Fork 历史 0 ★ / 34 ⇿
0Star
34Fork
2发布

每颗 star 和每个 fork 的添加时间,来自 GitHub 并按天汇总。累计增长位于其构成来源——每日新增——的正上方,二者可相互对照:稳定的自然增长与短暂的突增形态截然不同。当这一差别可被衡量时,它会作为增长真实性予以报告。

152025303534192026-052026-062026-06
主版本 0次版本 1修订 1
OpenSSF Scorecard 1.6 / 10
1.6综合

来自开源项目 OpenSSF Scorecard 的独立、工具无关的安全评估。每项检查奖励的是安全实践本身,而非特定供应商的工具。Scorecard 无法判定的检查项标记为 不适用,并从安全评分中剔除(绝不按零分计)。Scorecard v5.5.0 · 2026-07-23 06:40 UTC

10Binary-Artifactsno binaries found in the repo
0Branch-Protectionbranch protection not enabled on development/release branches
0CI-Tests0 out of 5 merged PRs checked by a CI test -- score normalized to 0
0CII-Best-Practicesno effort to earn an OpenSSF best practices badge detected
0Code-ReviewFound 0/9 approved changesets -- score normalized to 0
3Contributorsproject has 1 contributing companies or organizations -- score normalized to 3
不适用Dangerous-Workflowno workflows found
0Dependency-Update-Toolno update tool detected
0Fuzzingproject is not fuzzed
10Licenselicense file detected
0Maintainedproject was created within the last 90 days. Please review its contents carefully
不适用Packagingpackaging workflow not detected
不适用Pinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
不适用Signed-Releasesno releases found
不适用Token-PermissionsNo tokens found
1Vulnerabilities9 existing vulnerabilities detected
全部依赖 未采集

本报告未能采集到解析后的依赖集合:GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

原始 JSON 报告 机器可读
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 2582,
      "has_wiki": true,
      "homepage": null,
      "languages": {
        "TypeScript": 249347
      },
      "pushed_at": "2026-07-17T21:38:28Z",
      "created_at": "2026-05-16T01:26:20Z",
      "owner_type": "Organization",
      "updated_at": "2026-07-22T06:47:50Z",
      "description": "TypeScript SDK for the xtrace memory API",
      "is_archived": false,
      "is_disabled": false,
      "license_spdx": "MIT",
      "default_branch": "main",
      "license_spdx_raw": "MIT",
      "primary_language": "TypeScript",
      "significant_languages": [
        "TypeScript"
      ]
    },
    "owner": {
      "blog": null,
      "name": null,
      "type": "Organization",
      "login": "XTraceAI",
      "company": null,
      "location": null,
      "followers": 3,
      "avatar_url": "https://avatars.githubusercontent.com/u/170989492?v=4",
      "created_at": "2024-05-28T00:32:34Z",
      "is_verified": null,
      "public_repos": 6,
      "account_age_days": 786
    },
    "license": {
      "state": "standard",
      "spdx_id": "MIT",
      "raw_spdx": "MIT",
      "file_present": true,
      "scorecard_found": true,
      "profile_has_license": true
    },
    "activity": {
      "releases": [
        {
          "tag": "v0.5.0",
          "kind": "minor",
          "published_at": "2026-07-17T21:37:44Z"
        },
        {
          "tag": "v0.4.0",
          "kind": "minor",
          "published_at": "2026-07-10T00:37:21Z"
        },
        {
          "tag": "v0.3.0",
          "kind": "minor",
          "published_at": "2026-06-24T02:31:29Z"
        },
        {
          "tag": "v0.2.1",
          "kind": "patch",
          "published_at": "2026-06-01T21:25:34Z"
        },
        {
          "tag": "v0.2.0",
          "kind": "minor",
          "published_at": "2026-05-31T18:54:30Z"
        },
        {
          "tag": "v0.1.1",
          "kind": "patch",
          "published_at": "2026-05-27T23:05:22Z"
        }
      ],
      "recent_commits": [
        {
          "oid": "cda5165a021374ae716662d555b53667e6325820",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.5.0",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-07-17T21:37:44Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "82f1c2e3da2001f73ff7061f0f6b3e5e0dc13823",
          "body": "feat(ai-sdk): withDirectiveRecall — procedural-memory recall around tools",
          "is_bot": false,
          "headline": "Merge pull request #15 from XTraceAI/fm-feat/ai-sdk-directive-middleware",
          "author_name": "felix-xtrace",
          "author_login": "felix-xtrace",
          "committed_at": "2026-07-15T18:43:23Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "4927a7dbf1ad76b1a6c187a92b94be541679f0e2",
          "body": "[medium] the reservation cleanup only ran on the success paths; a throwing\noriginalExecute propagated correctly but skipped release(), leaking its\nreserved directive ids into the shared fired set forever — silent loss on\nany later successful call. Wrap the tool call: on throw, settle the\nin-flight r\n[…]\nded), release all, re-throw.\nNew test asserts the error propagates AND the directive resurfaces next call.\n\n65 passing, typecheck + build clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ai-sdk): release reserved ids when a tool throws (review)",
          "author_name": "felix-xtrace",
          "author_login": "felix-xtrace",
          "committed_at": "2026-07-15T02:26:15Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "d34e3890d27ea9bcd7c9fb370dd755c8a0aa3346",
          "body": "…review)\n\n[low] fired is shared across wrapped tools, and the check (!fired.has) and\nact (add) spanned the tool-execution await — two parallel tool calls (the\nAI SDK runs tools concurrently) could both select the same directive and\ndouble-deliver. Move to optimistic reservation: recall reserves ids \n[…]\niver() no longer owns fired. New concurrency test asserts\nexactly-once delivery across two parallel calls.\n\n64 passing, typecheck + build clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ai-sdk): close the fired-once race across concurrent tool calls (…",
          "author_name": "felix-xtrace",
          "author_login": "felix-xtrace",
          "committed_at": "2026-07-15T02:20:54Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "e74f2a0203a8d7825db3455184207e13bebc2c91",
          "body": "…reactive priority (review)\n\nThree more review findings on the directive middleware:\n\n- [high] a directive recalled at an undeliverable moment (array/number\n  result, no observer) was still added to the fired set — silently lost,\n  and blocked from a later injectable call, contradicting the 'keeps i\n[…]\now take budget priority.\n\n3 new tests (undeliverable keeps its chance, Date not spread, reactive\npriority); 63 passing, typecheck + build clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ai-sdk): correct fired-once accounting, non-plain-object safety, …",
          "author_name": "felix-xtrace",
          "author_login": "felix-xtrace",
          "committed_at": "2026-07-15T02:13:47Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "1cd99de00d1c5cdc4a3db8f59a2d62e6671f0d7e",
          "body": "…e exact tag (review follow-up)\n\nThe tag-specific neutralize regex missed whitespace/attribute variants\n(</team-directives >, <team-directives foo=x>) that a fuzzy model parser\nwould still honor as a block close. Escape the whole angle-bracket class in\ndirective text instead — provably complete, and the model reads &lt;/&gt;\nas literal characters. Test now asserts the whitespace + attribute variants\nare defanged too.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ai-sdk): escape all angle brackets in directive text, not just th…",
          "author_name": "felix-xtrace",
          "author_login": "felix-xtrace",
          "committed_at": "2026-07-15T02:06:59Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "72f8de70d95b377ba1a29d95777f14d8f76c5662",
          "body": "…er, redaction, reactive FP\n\nFour MemHub-review findings on the directive middleware:\n\n- [medium] prompt-injection sink: directive text is teammate-authored\n  (untrusted) and was appended verbatim inside a <team-directives> block a\n  malicious directive could break out of. Neutralize <team-directive\n[…]\n  can supply a precise check.\n\n4 new tests (breakout defang, no-clobber, redaction, isFailure suppression);\n60 passing, typecheck + build clean.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(ai-sdk): harden withDirectiveRecall per review — injection, clobb…",
          "author_name": "felix-xtrace",
          "author_login": "felix-xtrace",
          "committed_at": "2026-07-15T02:00:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0db99173f7cda53a1ce1bf449e3c2a3e43592ea0",
          "body": "…ools\n\nWrap any AI SDK tools object so every tool call fires the symbol tripwire:\npre-tool recall runs CONCURRENTLY with execute (never delays the tool), a\nreactive second recall fires when a string result looks like a failure\n(the error text names the true cause — identifiers the args never showed)\n[…]\ntility\nreplay. 7 tests: wire contract, dedup, object/array injection shapes,\nreactive pass, fail-open (error + timeout), no-execute passthrough.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(ai-sdk): withDirectiveRecall — procedural-memory recall around t…",
          "author_name": "felix-xtrace",
          "author_login": "felix-xtrace",
          "committed_at": "2026-07-15T01:55:24Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "32421bf9337893e316968d31d837ac9922e76d37",
          "body": "feat(directives): memories.trigger() + agentic/namespace ingest",
          "is_bot": false,
          "headline": "Merge pull request #14 from XTraceAI/fm-feat/directive-trigger-surface",
          "author_name": "felix-xtrace",
          "author_login": "felix-xtrace",
          "committed_at": "2026-07-14T23:29:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "caf400ebd2416f0caa502483a8a999560c4ec21b",
          "body": "Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: satisfy noUncheckedIndexedAccess in trigger tests",
          "author_name": "felix-xtrace",
          "author_login": "felix-xtrace",
          "committed_at": "2026-07-14T01:46:24Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "016f878a1aca1d31e59bb3fa3a44dba80577e279",
          "body": "… procedural-memory surface\n\n- Vendor the fixed staging OpenAPI spec (DirectiveDetails was a dangling\n  $ref that hard-failed openapi-typescript — fixed server-side in\n  VecDB-Backend #153) and regenerate src/generated/types.ts: first regen\n  since the directive/agentic surface shipped.\n- types: les\n[…]\nall recall,\n  body passed through verbatim (server defaults stay in charge).\n- tests: trigger wire contract + directive-row typing (49 passing).\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(directives): memories.trigger() + agentic/namespace ingest — the…",
          "author_name": "felix-xtrace",
          "author_login": "felix-xtrace",
          "committed_at": "2026-07-14T01:46:00Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2ea935918c247783daa680f010eda41778607398",
          "body": null,
          "is_bot": false,
          "headline": "0.4.0",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-07-10T00:37:21Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9576b0e5b0ddc1f61c3b831bb31367b59a2bf31c",
          "body": "feat: support prompt-less (catch-all) groups",
          "is_bot": false,
          "headline": "Merge pull request #13 from XTraceAI/claude/jolly-williamson-a11418",
          "author_name": "Tristan Chen",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-07-10T00:35:26Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dae1cece3cc0476c97e0a6d4d64cb52677c5b913",
          "body": "examples/groups-smoke.ts (npm run smoke:groups) walks the whole\ncatch-all surface against a live API: prompted create regression,\nprompt-less create -> prompt null, empty-string 422s on create and\nPATCH, null round-trip through get/list, PATCH converting a catch-all\nto prompted, ingest tagging a sha\n[…]\nonal memory stays untagged (classifier-dependent, so\nsoft-fail), and archived ids echoing in ignored_group_ids. Cleans up\neverything it creates.\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "test: add staging smoke script for catch-all groups",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-07-08T01:58:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "80f0429296ef2e66a3e8f76c0c8a67dd896a1e24",
          "body": "VecDB-Backend now allows creating a group without a prompt\n(GroupCreateRequest.required == [\"name\"] in the regenerated OpenAPI\nspec). A prompt-less group is a catch-all: the ingest classifier tags\nit on every extracted memory it judges shareable, with no per-group\nmatching. Personal memories are nev\n[…]\n can never\n  be removed via update\n- Add a create-without-prompt test asserting the request body omits\n  the key and the null prompt round-trips\n\nCo-Authored-By: Claude Fable 5 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: support prompt-less (catch-all) groups",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-07-08T00:50:50Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "52e831fb4cb11c61d6c33c6283ddc4aaf2aaaf0d",
          "body": "feat: webhooks support (client.webhooks + signature verification)",
          "is_bot": false,
          "headline": "Merge pull request #10 from XTraceAI/feat/webhooks",
          "author_name": "Tristan Chen",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-24T02:31:29Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d490de2ba8e31c51e96a7422b7af9b581def0975",
          "body": "Codex review (#10): the test sign() helper used the gated\nglobalThis.crypto, so on stock Node 18 the suite ReferenceErrors before\nany assertion. Use node:crypto.webcrypto in the signer so tests cover\nthe advertised node >=18 range (and so the global-absent test can null\nglobalThis.crypto without breaking signing).",
          "is_bot": false,
          "headline": "test: sign webhook fixtures with node:crypto (Node 18 compat)",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-24T02:23:32Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "bfc3d942d88cef0f6b5829b1610d4965a20fd0b6",
          "body": "Codex review (#10): verifyWebhookSignature read globalThis.crypto.subtle,\nwhich on Node 18.x is gated behind --experimental-global-webcrypto — so\nit threw before verifying on stock Node 18 even though the package\nadvertises node >=18.\n\nResolve SubtleCrypto across runtimes: prefer globalThis.crypto.s\n[…]\nzily import node:crypto.webcrypto\n(always present on Node). The import is dynamic + guarded so non-Node\nbundles never pull in node:crypto. Adds a test simulating Node 18\n(globalThis.crypto undefined).",
          "is_bot": false,
          "headline": "fix: webhook signature verification works on Node 18",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-24T02:01:45Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "caa8de236b05a2f9d38d10580a5a596e38c6b4a2",
          "body": "Codex review (#10): at-most-once is misleading given retries — a lost\n2xx after the handler ran triggers a duplicate. State deliveries may be\ndropped or duplicated; dedupe on job_id.",
          "is_bot": false,
          "headline": "docs: correct webhook delivery semantics in README",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-24T01:51:02Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "12cbadbfed95485e62b864fc5426345298745bc6",
          "body": "Add first-class support for ingestion-completion webhooks:\n\n- client.webhooks.set() / get() / delete() for the per-org /v1/webhooks\n  config (set() takes { rotateSecret } to mint a fresh signing secret).\n- verifyWebhookSignature() / parseWebhookEvent() — HMAC-SHA256 over the\n  raw body via Web Crypt\n[…]\n,\n  WebhookMemoryRef.\n- README \"Webhooks\" section + raw-body verification example.\n\nMinor bump → 0.3.0. 45 tests pass; typecheck + build clean.\n\nCo-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: webhooks support (client.webhooks + signature verification)",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-24T01:37:43Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "0737c6ecd0a88f47d6d54ba4eef5da3df214d76a",
          "body": null,
          "is_bot": false,
          "headline": "change from docs.mem to docs",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-05T16:51:17Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "2fa0d3d0f51026ceb411ef192f558d1d4fb7bf4f",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.2.1",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T21:25:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9cb76798dbedc38f7d04e165942cc1cbe9a42d9e",
          "body": "feat(sdk): generalize recall() to union arbitrary scope pools",
          "is_bot": false,
          "headline": "Merge pull request #8 from XTraceAI/tc/recall-pools",
          "author_name": "Tristan Chen",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T21:15:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "005dcf8ac2b980f6398616d717d801d1c300c31d",
          "body": "Addresses Codex P2 on #8: a JS caller (no compiler) passing a bare string, e.g.\npools: [{ group_ids: \"grp_x\" }], slipped past validation because strings have\n.length, then forwarded a non-array group_ids to /v1/memories/search. recall()\nnow rejects any non-array group_ids with a clear error. TS callers are already\nprotected by the string[] type; this guards the untyped path.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sdk): reject a non-array group_ids in a recall pool",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T21:05:14Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "685896b713d588ce7e7250c707f3ca568e0a7d39",
          "body": "Addresses Codex P2 on #8: a dynamically-built pool like { user_id, group_ids: [] }\npassed validation (user_id is an axis) but then spread group_ids: [] into the\nsearch — an empty any-of that AND-narrows to nothing server-side, silently\nturning a personal recall into a match-nothing scoped search. re\n[…]\nains) and never forwarded; a\npool left with no real axis still throws. Unifies the empty-array and zero-axis\ncases under one rule.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sdk): strip empty axes from recall pools before search",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T20:57:07Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "33d19fd3d8ca4147b1c696baac1ecae7bc0a9162",
          "body": "Addresses Codex P2 on #8: the round-1 multi-user fix attributed any non-viewer\nrow 'everywhere', but viewerUserId is optional — so a standalone\nrenderMemoriesPrompt() on one user's personal rows (which always carry user_id)\nwith no viewer rendered every line as 'alice: ...', changing the exported\nre\n[…]\n as before. Adds a standalone test (real rows have user_id, the\nfixtures defaulted user_id:null so this regression was invisible).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sdk): gate personal-row author attribution on a known viewer",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T20:49:36Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "3539b59f17b4b23f50da2b5e8cb80fe2d783b592",
          "body": "…ng them\n\nAddresses Codex P2 on #8: the pool filter silently removed any pool with no\nscope axis, so a typo'd `group_id` or an empty `group_ids: []` alongside a valid\npool would make recall() return a plausible-but-incomplete result with the\nrequested scope quietly missing. Now each pool is validate\n[…]\n conditionally must omit it\nexplicitly. ai-sdk tool already normalizes empty groups to undefined, so it\nnever trips the new guard.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sdk): recall() rejects malformed pools instead of silently droppi…",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T20:42:44Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "906f8b2452e3aa9711031477b25012891fa9fdec",
          "body": "Addresses Codex P2 on #8: the anti-bleed filter was gated on pool.user_id, so a\ndeliberately-scoped pool like { user_id, app_id } still got its rows dropped when\nthey carried a non-requested group tag — violating the AND-within-pool contract\n(the axes already narrow it; the caller asked for exactly \n[…]\nly to a PLAIN { user_id } pool (no app_id/agent_id/group_ids);\nany extra axis is treated as a deliberate scope and returned as-is.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sdk): bleed-filter only the plain personal pool, not every user pool",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T20:35:51Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "91460e50aead1afc3fd971d2a60540b22307c960",
          "body": "… memories\n\nAddresses Codex P2 on #8: with pools: [{user_id}, {app_id:'product-kb'}],\nthe KB rows have no group, so they fell into the Personal / 'memories about\nthe user' section — framing a doc as the user's own fact. recall() now labels\nrows from a non-user, non-group pool with their app_id/agent\n[…]\nhose under that source label (no author attribution). User-pool rows\ntake precedence (a row also from a user pool stays Personal).\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "fix(sdk): section app/agent-pool rows under their source, not as user…",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T20:03:45Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "ed13ffc9331850d4254df4c38256e3b303a297ea",
          "body": "- Cross-group anti-bleed filter is now USER-pool-only. It was applied to every\n  pool without group_ids, so combining an app/agent pool with a group pool\n  silently dropped the app pool's rows that happened to carry an unrelated group\n  tag (e.g. a product-KB doc tagged grp_docs, recalled alongside \n[…]\ndocs/types all pools-only,\nno current backward-compat claim). The bots flagged the superseded first commit.\n\n+2 tests (app-pool preserved, second-user attribution) → 30 total. typecheck + build green.",
          "is_bot": false,
          "headline": "fix(sdk): address #8 review — recall() pool edge cases",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T19:48:16Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "f56249801b7aee5bc37e4872e22b84c39456c1be",
          "body": null,
          "is_bot": false,
          "headline": "docs(releasing): example version 0.2.1 (next release)",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T19:40:36Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "97b0e35f38d9629ff35a130642a8da48e1a5265a",
          "body": null,
          "is_bot": false,
          "headline": "docs(readme): recall() example uses pools",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T19:35:05Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "dc49b3aa7ea6f954b13c9b31ebc3ca4c580adb76",
          "body": "…elds)\n\nPer design review: the convenience form mixed semantics confusingly — it OR'd\nuser_id vs group_ids but AND-narrowed agent_id/app_id, an implicit shape that's\nhard to reason about. Make recall a single, explicit rule instead:\n\n    recall({ query, pools: [{ user_id }, { group_ids }] })   // ax\n[…]\n to pools-only. 28 pass, typecheck + build green.\n\nBREAKING CHANGE: recall({ user_id, group_ids }) no longer works; pass\n`pools: [{ user_id }, { group_ids }]`. (Only affects 0.2.0, released days ago.)",
          "is_bot": false,
          "headline": "refactor(sdk)!: recall() is pools-only (drop the convenience union fi…",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T19:30:55Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "efb0d2f96a2ec9ace5f3494d599ded4ad952c90d",
          "body": "recall() previously hardcoded the union to `user_id OR group_ids`, which made\nthe union mechanism look group-specific and left other blends (e.g. personal +\na global app_id KB) as a manual two-search merge. The union is general, so\nrecall now takes an explicit `pools` list:\n\n    recall({ query, pool\n[…]\netry where groups got a one-liner but app_id\nneeded concurrent manual searches.\n\nTests: +4 (explicit-pool union, validation, cross-pool bleed filter, legacy\nsugar) → 29 total. typecheck + build green.",
          "is_bot": false,
          "headline": "feat(sdk): generalize recall() to union arbitrary scope pools",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-06-01T19:14:25Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "3eb4ff53b80174b6cf18e46862b903243623b600",
          "body": "docs: add RELEASING.md (manual npm publish flow)",
          "is_bot": false,
          "headline": "Merge pull request #7 from XTraceAI/tc/releasing-doc",
          "author_name": "Tristan Chen",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T19:15:34Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "94024e4c4f675a5b99adc30c7ce3811a17b16805",
          "body": null,
          "is_bot": false,
          "headline": "docs(releasing): verify npm whoami is tristangc before publishing",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T19:08:45Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "124bee96927799a47c70244a9c3d28b5e14e9918",
          "body": "… 0.2.0 run",
          "is_bot": false,
          "headline": "docs(releasing): publish before tagging; add troubleshooting from the…",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T19:04:35Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "a5957a9dfc1d3a8e38ca0cbda1ef0d8ff92453d6",
          "body": null,
          "is_bot": false,
          "headline": "Merge main (0.2.0 release commit)",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T19:03:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c389cf965f9a517fa3b1db9fa9d1a3770252d0e0",
          "body": null,
          "is_bot": false,
          "headline": "release: v0.2.0",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T18:54:30Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "01285b22c665e822618b69f727b031b19f34a9ea",
          "body": null,
          "is_bot": false,
          "headline": "Merge main (#6) into releasing-doc",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T18:30:58Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "b4ffe319ac38ca7704efa5d8dc95a5581c24e484",
          "body": null,
          "is_bot": false,
          "headline": "docs: add RELEASING.md (manual npm publish flow)",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T18:28:13Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "c165eb63d2fd11b7cd1b79e45f1012c70980edac",
          "body": "feat(sdk): recall() (personal + shared) + sync SDK to deployed API",
          "is_bot": false,
          "headline": "Merge pull request #6 from XTraceAI/tc/sdk-recall-and-sync",
          "author_name": "Tristan Chen",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T17:38:20Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "43f614857f5b40616c9f2619253429088d3353bd",
          "body": "Two genuinely-new review findings on the prior commit (the others re-flagged\nby the bots were already fixed there):\n\n- limit=1 no longer always favors the personal scope. The round-robin took\n  personal first every round, so `recall({ user_id, group_ids, limit: 1 })`\n  dropped the shared scope even \n[…]\nall to untagged memories\".) This\n  complements the earlier render-side fix (sections only requested groups).\n\nTests: +2 (limit-1 global-max, other-group exclusion) → 25 total. typecheck +\nbuild green.",
          "is_bot": false,
          "headline": "fix(sdk): recall() limit=1 fairness + drop other-group bleed (round 2)",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T16:53:22Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "32f150d2fe051738508732d95349a08466a8823d",
          "body": "Four issues flagged by Codex/Cursor on recall() + the ai-sdk tools:\n\n- save_memory now forwards the group scope. memoryTools normalizes the group\n  scope once (groupIds) and BOTH search_memory (via recall) and save_memory\n  (via ingest group_ids) use it, so model-saved facts can be group-tagged and\n\n[…]\nedGroupIds keeps the prior \"section every tag\" behavior (back-compat).\n\nTests: +7 (fair-merge, requested-group bucketing, multi-tag, tool save/gate) —\n23 total across 3 files. typecheck + build green.",
          "is_bot": false,
          "headline": "fix(sdk): address #6 review — recall group-scope correctness",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T08:15:40Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "c83ce46a8691759c91bc7b189f3e761128d0de01",
          "body": "Shared (group) lines now carry their author so a multi-traveler group is\nunambiguous: \"<user_id>: <fact>\", or \"you: <fact>\" when it's the caller's own\nrow (recall passes the caller as viewerUserId). Personal lines stay\nunattributed (always the caller). Uses m.user_id — which a cross-user group\nread \n[…]\nead (alice→\"you\", bob→\"bob-…\"). 17 tests,\ntypecheck + build green.\n\nNote: shows the raw user_id; human display names would be a phase-2 concern\n(server template / widened payload), tracked in ENG-108.",
          "is_bot": false,
          "headline": "feat(sdk): attribute group memories to their author in recall() prompt",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T08:02:33Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "fdfac348c6ec1244a0c49b21d4ad76bc5e294ed7",
          "body": "…able format)\n\nExtract the prompt format into a JSON-serializable PromptTemplate\n(DEFAULT_PROMPT_TEMPLATE) that drives renderMemoriesPrompt: header,\npersonal/unknown-group labels, per-type tags, and category/date toggles.\nDefault output is unchanged.\n\nSets up phase 2: a future API endpoint can retur\n[…]\n, full\nartifact bodies, or char-budgeting without also widening the search payload.\n\nExports PromptTemplate + DEFAULT_PROMPT_TEMPLATE. 16 tests (added a\ncustom-template case); typecheck + build green.",
          "is_bot": false,
          "headline": "refactor(sdk): make recall() prompt template-driven (phase 1 of swapp…",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T07:46:28Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "070cbfd23a74f336f17d331aa3b31c173e417c8c",
          "body": "…tags)\n\nFacts still render as plain statements; artifacts and episodes now get a\ntype tag and their title — \"[document] <title>: <text>\" and\n\"[conversation] <title>: <text>\" — so the agent can tell a stored document\nor a past conversation from a stated fact. Uses only m.type / m.details\nalready on e\n[…]\nparity\nwould need a backend assemble-over-merged-set endpoint, which adds a\nsequential round-trip after the fan-out — declined here to keep recall fast.\n\nTest added; 15 total, typecheck + build green.",
          "is_bot": false,
          "headline": "feat(sdk): light type-awareness in recall() render (artifact/episode …",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T07:40:30Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "e4db7ced321adae7747553f96ea6fae50ebdf771",
          "body": "Memory rows carry only opaque group_ids, so the prompt couldn't name the\ngroup. recall() now resolves group id → name from the registry (one\nGET /v1/groups, fired in parallel with the searches — ~free latency,\nbest-effort: a lookup failure falls back to id labels rather than failing\nthe call). rende\n[…]\nacts under its own name.\n\nTests: name-resolution + per-group sectioning + id fallback (14 total).\nValidated live on staging — shared section headed by the group name,\nopaque id absent from the prompt.",
          "is_bot": false,
          "headline": "feat(sdk): recall() labels shared sections by group NAME",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T07:29:00Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "7da2318468fa82712acab75342634779b041eb01",
          "body": "…egories + date\n\nrenderMemoriesPrompt now groups the merged memories into \"Personal\" and\n\"Shared (group)\" sections (by each row's group_ids — tagged = shared,\nuntagged = personal), falling back to a flat list when only one kind is\npresent. Each bullet carries the memory's categories (`[...]`) and re\n[…]\nhile staying fully deterministic and client-side (no LLM, no backend\ncall). Still overridable via `recall(..., { render })`.\n\nAdded a grouping test; updated the flat-list test for the new line format.",
          "is_bot": false,
          "headline": "feat(sdk): richer recall() prompt — split personal vs shared, add cat…",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T07:15:01Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "a7da7a9c443ec8a66a356678a29ff8a8d9872a86",
          "body": "…yed API\n\n## recall() — personal + shared (group) read in one call\n\nSearch scoping is AND-everything (\"scope by what you pass\"), so a combined\n\"my own preferences AND the trip's shared facts\" read can't be one request\n(`{user_id, group_ids}` intersects). `client.memories.recall()` rebuilds that\nunio\n[…]\negenerated via `npm run gen:types`) is still\nstale; left out of scope — it's a reference artifact, not part of the public surface.\n\nCo-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat(sdk): add recall() (personal + shared) and sync SDK to the deplo…",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-31T07:00:28Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "fd9978d4ef5e4f4bb0381c78a7b0b2d409898077",
          "body": "update readme",
          "is_bot": false,
          "headline": "Merge pull request #5 from XTraceAI/chore/update-readme",
          "author_name": "Liwen O.",
          "author_login": "liwenXtrace",
          "committed_at": "2026-05-28T20:22:15Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "9d4aeac0be566bcf843196856223fdaf2a25e373",
          "body": null,
          "is_bot": false,
          "headline": "update readme",
          "author_name": "Sebastian Gonzalez",
          "author_login": "sgonz-xtrace",
          "committed_at": "2026-05-28T19:58:06Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "d9eb8ebb70ec58aabf0d0813bcb3fc62d1a53039",
          "body": "Flip the SDK-side default in memories.ingest() so the artifact\nextraction stage runs unless callers explicitly pass\n`extract_artifacts: false`. The server still treats an absent key\nas off, so the SDK now sends the resolved value on every request.\n\nThe ai-sdk wrappers (auto-ingest middleware in prov\n[…]\n message pairs and\none-line facts rarely benefit from the artifact stage and it is the\nmost expensive extraction step.\n\nBumps version to 0.1.1.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: default extract_artifacts to true for direct ingest",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-27T23:05:22Z",
          "body_truncated": true,
          "is_coding_agent": true
        },
        {
          "oid": "2ed0a44319a8a323c3e3ee5f8007793ef482b36b",
          "body": "Two patterns ship under @xtraceai/memory/ai-sdk:\n\n- createXtraceMemory(): wraps any LanguageModel so it auto-searches\n  memory before each call and auto-ingests the turn after. Mem0's\n  provider pattern — set it and forget it.\n\n- memoryTools(): exposes search_memory and save_memory as tools the\n  LL\n[…]\ns where the model decides\n  when to read / write memory.\n\nai and zod are optional peer dependencies; users who only import\nthe core SDK don't pull them in. Bumps version to 0.1.0 (new public\nsurface).",
          "is_bot": false,
          "headline": "feat(ai-sdk): add Vercel AI SDK integration at /ai-sdk subpath",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-22T21:29:48Z",
          "body_truncated": true,
          "is_coding_agent": false
        },
        {
          "oid": "94b0f91704f3690a4753c4aa19a256295d04b54d",
          "body": null,
          "is_bot": false,
          "headline": "chore: drop mem0 from package keywords",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-22T01:27:55Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "65ece6d0f47cb575d2c942781078749b299abca5",
          "body": null,
          "is_bot": false,
          "headline": "docs: point at app.xtrace.ai for credentials + docs link",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-21T21:07:43Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "98639fa66f23b5f8e32c7b16036ba96c13915618",
          "body": "- Default baseUrl now points to https://api.production.xtrace.ai\n  (was api.xtrace.ai, which returns 404)\n- Re-apply scope rename @xtrace → @xtraceai that was lost in reset\n- Bump to 0.0.2",
          "is_bot": false,
          "headline": "fix: correct production base URL to api.production.xtrace.ai",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-20T23:56:39Z",
          "body_truncated": false,
          "is_coding_agent": false
        },
        {
          "oid": "1d866fe6a0b7fc167ad2215cb15021b95ba4ea10",
          "body": "Tests will land in a follow-up PR. The --passWithNoTests flag\nkeeps prepublishOnly from blocking the squat release.\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: bump to 0.0.1 + allow empty test suite for publish",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-16T01:28:12Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "428c38aa06236463a9fb7983f2e7f05b7e931290",
          "body": "Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "chore: use canonical XTraceAI casing in repo URLs",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-16T01:26:13Z",
          "body_truncated": false,
          "is_coding_agent": true
        },
        {
          "oid": "b7fb885a1ce1ace44f91c56fc9f56ccfd83759b9",
          "body": "Hand-written SDK targeting the v0.1 xtrace memory API. Covers\ningest (async + sync via wait=true), job polling with exponential\nbackoff, list (cursor-paginated async iterator), get, update,\ndelete, search, and the retrieve sugar for context_prompt.\n\nTypes match the live staging /openapi.json (regene\n[…]\neLimited, Unprocessable, etc.) keyed on the API's stable\nerror.code strings.\n\nEnd-to-end smoke test against staging passes (examples/smoke.ts).\n\nCo-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>",
          "is_bot": false,
          "headline": "feat: initial @xtrace/memory TypeScript SDK",
          "author_name": "tristan-xtrace",
          "author_login": "tristan-xtrace",
          "committed_at": "2026-05-16T01:23:30Z",
          "body_truncated": true,
          "is_coding_agent": true
        }
      ],
      "releases_count": 6,
      "commits_last_year": 60,
      "latest_release_at": "2026-07-17T21:37:44Z",
      "latest_release_tag": "v0.5.0",
      "releases_from_tags": true,
      "days_since_last_push": 5,
      "active_weeks_last_year": 8,
      "days_since_latest_release": 5,
      "mean_days_between_releases": 10.2
    },
    "community": {
      "has_readme": true,
      "has_license": true,
      "has_description": true,
      "has_contributing": false,
      "health_percentage": 50,
      "has_issue_template": false,
      "has_code_of_conduct": false,
      "has_pull_request_template": false
    },
    "ecosystem": {
      "packages": [
        {
          "name": "@xtraceai/memory",
          "exists": true,
          "license": "MIT",
          "keywords": [
            "xtrace",
            "memory",
            "sdk",
            "ai",
            "agent",
            "ai-sdk",
            "vercel-ai-sdk"
          ],
          "ecosystem": "npm",
          "matches_repo": true,
          "registry_url": "https://www.npmjs.com/package/@xtraceai/memory",
          "is_deprecated": false,
          "latest_version": "0.5.0",
          "repository_url": "https://github.com/XTraceAI/memory-sdk-ts",
          "versions_count": 9,
          "total_downloads": null,
          "dependents_count": null,
          "deprecation_note": null,
          "maintainers_count": 1,
          "monthly_downloads": 5024,
          "first_published_at": "2026-05-16T01:42:32.983000Z",
          "latest_published_at": "2026-07-17T21:38:18.141000Z",
          "latest_version_yanked": null,
          "days_since_latest_publish": 5
        }
      ]
    },
    "popularity": {
      "forks": 34,
      "stars": 274,
      "watchers": 1,
      "fork_history": {
        "days": [
          {
            "date": "2026-05-28",
            "count": 19
          },
          {
            "date": "2026-05-29",
            "count": 1
          },
          {
            "date": "2026-05-30",
            "count": 1
          },
          {
            "date": "2026-05-31",
            "count": 2
          },
          {
            "date": "2026-06-02",
            "count": 1
          },
          {
            "date": "2026-06-04",
            "count": 2
          },
          {
            "date": "2026-06-05",
            "count": 3
          },
          {
            "date": "2026-06-06",
            "count": 4
          },
          {
            "date": "2026-06-12",
            "count": 1
          }
        ],
        "complete": true,
        "collected": 34,
        "total_forks": 34
      },
      "star_history": null,
      "open_issues_and_prs": 1
    },
    "ai_readiness": {
      "has_nix": false,
      "example_dirs": [
        "examples"
      ],
      "has_llms_txt": false,
      "has_dockerfile": false,
      "has_mcp_signal": false,
      "bootstrap_files": [],
      "api_schema_files": [],
      "has_devcontainer": false,
      "typecheck_configs": [
        "tsconfig.json"
      ],
      "toolchain_manifests": [],
      "largest_source_bytes": 23316,
      "source_files_sampled": 22,
      "oversized_source_files": 0,
      "agent_instruction_files": [],
      "agent_instruction_max_bytes": null
    },
    "dependencies": {
      "manifests": [
        "package.json"
      ],
      "advisories": {
        "error": null,
        "scope": null,
        "source": null,
        "findings": [],
        "collected": false,
        "malicious": [],
        "truncated": false,
        "by_severity": {},
        "advisory_count": 0,
        "affected_count": 0,
        "assessed_count": 0,
        "malicious_count": 0,
        "assessed_package": null,
        "unassessed_count": 0,
        "direct_affected_count": 0
      },
      "ecosystems": [
        "npm"
      ],
      "dependencies": [],
      "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": 1,
        "merged_prs": 10,
        "open_issues": 0,
        "closed_ratio": null,
        "closed_issues": 0,
        "closed_unmerged_prs": 4
      },
      "bus_factor": 1,
      "bot_contributors": 0,
      "top_contributors": [
        {
          "type": "User",
          "login": "tristan-xtrace",
          "commits": 48,
          "avatar_url": "https://avatars.githubusercontent.com/u/276746865?v=4"
        },
        {
          "type": "User",
          "login": "felix-xtrace",
          "commits": 10,
          "avatar_url": "https://avatars.githubusercontent.com/u/170989441?v=4"
        },
        {
          "type": "User",
          "login": "liwenXtrace",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/170989218?v=4"
        },
        {
          "type": "User",
          "login": "sgonz-xtrace",
          "commits": 1,
          "avatar_url": "https://avatars.githubusercontent.com/u/223328257?v=4"
        }
      ],
      "contributors_sampled": 4,
      "top_contributor_share": 0.8
    },
    "quality_signals": {
      "has_ci": false,
      "has_tests": true,
      "ci_workflows": [],
      "has_docs_dir": false,
      "linter_configs": [],
      "has_editorconfig": false,
      "has_linter_config": false,
      "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": 0,
            "reason": "0 out of 5 merged PRs checked by a CI test -- score normalized to 0",
            "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/9 approved changesets -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
          },
          {
            "name": "Contributors",
            "score": 3,
            "reason": "project has 1 contributing companies or organizations -- score normalized to 3",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
          },
          {
            "name": "Dangerous-Workflow",
            "score": null,
            "reason": "no workflows found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
          },
          {
            "name": "Dependency-Update-Tool",
            "score": 0,
            "reason": "no update tool detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
          },
          {
            "name": "Fuzzing",
            "score": 0,
            "reason": "project is not fuzzed",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
          },
          {
            "name": "License",
            "score": 10,
            "reason": "license file detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
          },
          {
            "name": "Maintained",
            "score": 0,
            "reason": "project was created within the last 90 days. Please review its contents carefully",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
          },
          {
            "name": "Packaging",
            "score": null,
            "reason": "packaging workflow not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
          },
          {
            "name": "Pinned-Dependencies",
            "score": null,
            "reason": "no dependencies found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
          },
          {
            "name": "SAST",
            "score": 0,
            "reason": "SAST tool is not run on all commits -- score normalized to 0",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
          },
          {
            "name": "Security-Policy",
            "score": 0,
            "reason": "security policy file not detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
          },
          {
            "name": "Signed-Releases",
            "score": null,
            "reason": "no releases found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
          },
          {
            "name": "Token-Permissions",
            "score": null,
            "reason": "No tokens found",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
          },
          {
            "name": "Vulnerabilities",
            "score": 1,
            "reason": "9 existing vulnerabilities detected",
            "documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
          }
        ],
        "commit": "cda5165a021374ae716662d555b53667e6325820",
        "ran_at": "2026-07-23T06:40:23Z",
        "aggregate_score": 1.6,
        "scorecard_version": "v5.5.0"
      },
      "has_codeql_workflow": false,
      "has_security_policy": false,
      "has_dependabot_config": false
    },
    "contribution_flow": {
      "collected": true,
      "ci_last_run_at": "2026-07-17T21:37:56Z",
      "oldest_open_prs": [
        {
          "number": 9,
          "created_at": "2026-06-15T05:39:10Z",
          "last_comment_at": null,
          "last_comment_author": null
        }
      ],
      "last_merged_pr_at": "2026-07-15T18:43:23Z",
      "ci_last_conclusion": null,
      "oldest_open_issues": []
    }
  },
  "config": {
    "disabled_metrics": [],
    "disabled_categories": [],
    "disabled_components": {}
  },
  "source": {
    "url": "https://github.com/XTraceAI/memory-sdk-ts",
    "host": "github.com",
    "name": "memory-sdk-ts",
    "owner": "XTraceAI"
  },
  "metrics": {
    "overall": {
      "key": "overall",
      "band": "at_risk",
      "name": "Overall health",
      "note": null,
      "notes": [],
      "value": 47,
      "inputs": {
        "security": 17,
        "vitality": 70,
        "community": 54,
        "governance": 51,
        "engineering": 34
      },
      "components": []
    },
    "categories": [
      {
        "key": "vitality",
        "band": "good",
        "name": "Vitality",
        "value": 70,
        "weight": 0.22,
        "metrics": [
          {
            "key": "development_activity",
            "band": "moderate",
            "name": "Development activity",
            "note": null,
            "notes": [],
            "value": 58,
            "inputs": {
              "commits_last_year": 60,
              "human_commit_share": 1,
              "days_since_last_push": 5,
              "active_weeks_last_year": 8
            },
            "components": [
              {
                "key": "push_recency",
                "name": "Push recency",
                "detail": "last push 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "push_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_cadence",
                "name": "Commit cadence",
                "detail": "8/52 weeks with commits",
                "points": 5.5,
                "status": "partial",
                "details": [
                  {
                    "code": "commit_cadence_weeks",
                    "params": {
                      "weeks": 8
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "commit_volume",
                "name": "Commit volume",
                "detail": "60 commits in the last year",
                "points": 16,
                "status": "partial",
                "details": [
                  {
                    "code": "commits_last_year",
                    "params": {
                      "count": 60
                    }
                  }
                ],
                "max_points": 18
              },
              {
                "key": "openssf_scorecard_maintained",
                "name": "OpenSSF Scorecard: Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "release_discipline",
            "band": "excellent",
            "name": "Release discipline",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Signed-Releases. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_signed_releases"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 88,
            "inputs": {
              "releases_count": 6,
              "latest_release_tag": "v0.5.0",
              "releases_from_tags": true,
              "days_since_latest_release": 5,
              "mean_days_between_releases": 10.2
            },
            "components": [
              {
                "key": "ships_releases",
                "name": "Ships releases",
                "detail": "6 version tags (no GitHub releases)",
                "points": 16.2,
                "status": "partial",
                "details": [
                  {
                    "code": "version_tags_no_releases",
                    "params": {
                      "count": 6
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "release_recency",
                "name": "Release recency",
                "detail": "latest release 5 days ago",
                "points": 36,
                "status": "met",
                "details": [
                  {
                    "code": "release_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 36
              },
              {
                "key": "release_cadence",
                "name": "Release cadence",
                "detail": "a release every ~10.2 days",
                "points": 27,
                "status": "met",
                "details": [
                  {
                    "code": "release_cadence",
                    "params": {
                      "gap": 10.2
                    }
                  }
                ],
                "max_points": 27
              },
              {
                "key": "openssf_scorecard_signed_releases",
                "name": "OpenSSF Scorecard: Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "abandonment",
            "band": "excellent",
            "name": "Abandonment",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "cap": null,
              "state": "unverified",
              "guards": [],
              "signals": [],
              "red_flag": false,
              "multiplier_pct": 100,
              "declared_reason": null,
              "unverified_reason": "repository_too_young",
              "unanswered_open_prs": null,
              "unanswered_open_issues": null,
              "days_since_last_merged_pr": null,
              "days_since_last_human_commit": null,
              "days_since_last_human_commit_is_floor": false
            },
            "components": [
              {
                "key": "project_is_still_maintained",
                "name": "Project is still maintained",
                "detail": "maintenance record not established from the collected data",
                "points": 100,
                "status": "met",
                "details": [
                  {
                    "code": "abandonment_unverified",
                    "params": {}
                  }
                ],
                "max_points": 100
              }
            ]
          }
        ],
        "description": "Is the project alive — is code being written and are releases shipping?"
      },
      {
        "key": "community",
        "band": "moderate",
        "name": "Community & Adoption",
        "value": 54,
        "weight": 0.18,
        "metrics": [
          {
            "key": "popularity",
            "band": "moderate",
            "name": "Popularity & adoption",
            "note": null,
            "notes": [],
            "value": 52,
            "inputs": {
              "forks": 34,
              "stars": 274,
              "watchers": 1,
              "growth_state": "unverified",
              "growth_factor_pct": 100,
              "growth_unverified_reason": "no_history"
            },
            "components": [
              {
                "key": "stars",
                "name": "Stars",
                "detail": "274 stars",
                "points": 39.5,
                "status": "partial",
                "details": [
                  {
                    "code": "stars",
                    "params": {
                      "count": 274
                    }
                  }
                ],
                "max_points": 60
              },
              {
                "key": "forks",
                "name": "Forks",
                "detail": "34 forks",
                "points": 12.7,
                "status": "partial",
                "details": [
                  {
                    "code": "forks",
                    "params": {
                      "count": 34
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "watchers",
                "name": "Watchers",
                "detail": "1 watchers",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "watchers",
                    "params": {
                      "count": 1
                    }
                  }
                ],
                "max_points": 15
              }
            ]
          },
          {
            "key": "community_health",
            "band": "moderate",
            "name": "Community health",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "has_readme": true,
              "has_license": true,
              "has_contributing": false,
              "has_issue_template": false,
              "has_code_of_conduct": false,
              "has_pull_request_template": false
            },
            "components": [
              {
                "key": "readme",
                "name": "README",
                "detail": null,
                "points": 22.5,
                "status": "met",
                "details": [],
                "max_points": 22.5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "recognized license (MIT)",
                "points": 22.5,
                "status": "met",
                "details": [
                  {
                    "code": "license_standard",
                    "params": {}
                  },
                  {
                    "code": "license_spdx",
                    "params": {
                      "spdx": "MIT"
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributing_guide",
                "name": "CONTRIBUTING guide",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "code_of_conduct",
                "name": "Code of conduct",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 13.5
              },
              {
                "key": "issue_template",
                "name": "Issue template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.2
              },
              {
                "key": "pr_template",
                "name": "PR template",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.3
              }
            ]
          },
          {
            "key": "ecosystem_adoption",
            "band": "moderate",
            "name": "Ecosystem adoption (downloads)",
            "note": "Excluded from scoring (no data or not applicable): Registry dependents. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "registry_dependents"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 62,
            "inputs": {
              "packages": [
                "@xtraceai/memory"
              ],
              "dependents": null,
              "ecosystems": "npm",
              "total_downloads": null,
              "monthly_downloads": 5024
            },
            "components": [
              {
                "key": "monthly_downloads",
                "name": "Monthly downloads",
                "detail": "5,024 downloads/month across npm",
                "points": 49.3,
                "status": "partial",
                "details": [
                  {
                    "code": "downloads_monthly",
                    "params": {
                      "count": 5024,
                      "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": 51,
        "weight": 0.24,
        "metrics": [
          {
            "key": "maintainer_resilience",
            "band": "critical",
            "name": "Maintainer resilience (bus factor)",
            "note": null,
            "notes": [],
            "value": 22,
            "inputs": {
              "bus_factor": 1,
              "contributors_sampled": 4,
              "top_contributor_share": 0.8
            },
            "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 80% of commits",
                "points": 4.5,
                "status": "partial",
                "details": [
                  {
                    "code": "top_contributor_share",
                    "params": {
                      "share": 80
                    }
                  }
                ],
                "max_points": 22.5
              },
              {
                "key": "contributor_breadth",
                "name": "Contributor breadth",
                "detail": "4 contributors",
                "points": 5.4,
                "status": "partial",
                "details": [
                  {
                    "code": "contributors_sampled",
                    "params": {
                      "count": 4
                    }
                  }
                ],
                "max_points": 13.5
              },
              {
                "key": "openssf_scorecard_contributors",
                "name": "OpenSSF Scorecard: Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 3,
                "status": "partial",
                "details": [],
                "max_points": 10
              }
            ]
          },
          {
            "key": "responsiveness",
            "band": "moderate",
            "name": "Issue & PR responsiveness",
            "note": "Excluded from scoring (no data or not applicable): Issue resolution. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "issue_resolution"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 51,
            "inputs": {
              "merged_prs": 10,
              "open_issues": 0,
              "closed_issues": 0,
              "issue_closed_ratio": null,
              "closed_unmerged_prs": 4
            },
            "components": [
              {
                "key": "issue_resolution",
                "name": "Issue resolution",
                "detail": "no issues or no data",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_issues_or_data",
                    "params": {}
                  }
                ],
                "max_points": 46.75
              },
              {
                "key": "pr_acceptance",
                "name": "PR acceptance",
                "detail": "10/14 decided PRs merged",
                "points": 27.3,
                "status": "partial",
                "details": [
                  {
                    "code": "decided_prs_merged",
                    "params": {
                      "merged": 10,
                      "decided": 14
                    }
                  }
                ],
                "max_points": 38.25
              },
              {
                "key": "openssf_scorecard_code_review",
                "name": "OpenSSF Scorecard: Code-Review",
                "detail": "Found 0/9 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              }
            ]
          },
          {
            "key": "stewardship",
            "band": "at_risk",
            "name": "Ownership & stewardship",
            "note": null,
            "notes": [],
            "value": 45,
            "inputs": {
              "followers": 3,
              "owner_type": "Organization",
              "is_verified": null,
              "owner_login": "XTraceAI",
              "public_repos": 6,
              "account_age_days": 786
            },
            "components": [
              {
                "key": "ownership_backing",
                "name": "Ownership backing",
                "detail": "organization-owned",
                "points": 30,
                "status": "met",
                "details": [
                  {
                    "code": "owner_organization",
                    "params": {}
                  }
                ],
                "max_points": 30
              },
              {
                "key": "verified_domain",
                "name": "Verified domain",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "owner_reach",
                "name": "Owner reach",
                "detail": "3 followers of XTraceAI",
                "points": 4.3,
                "status": "partial",
                "details": [
                  {
                    "code": "owner_followers",
                    "params": {
                      "count": 3,
                      "login": "XTraceAI"
                    }
                  }
                ],
                "max_points": 25
              },
              {
                "key": "track_record",
                "name": "Track record",
                "detail": "6 public repos, account ~2 yr old",
                "points": 10.5,
                "status": "partial",
                "details": [
                  {
                    "code": "public_repos",
                    "params": {
                      "count": 6
                    }
                  },
                  {
                    "code": "account_age_years",
                    "params": {
                      "years": 2
                    }
                  }
                ],
                "max_points": 25
              }
            ]
          },
          {
            "key": "package_maintenance",
            "band": "excellent",
            "name": "Package maintenance",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "packages": [
                "@xtraceai/memory"
              ],
              "ecosystems": "npm",
              "any_deprecated": false,
              "min_days_since_publish": 5
            },
            "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 5 days ago",
                "points": 35,
                "status": "met",
                "details": [
                  {
                    "code": "publish_recency",
                    "params": {
                      "days": 5
                    }
                  }
                ],
                "max_points": 35
              },
              {
                "key": "version_history",
                "name": "Version history",
                "detail": "9 published versions",
                "points": 20,
                "status": "met",
                "details": [
                  {
                    "code": "published_versions",
                    "params": {
                      "count": 9
                    }
                  }
                ],
                "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": "at_risk",
        "name": "Engineering Quality",
        "value": 34,
        "weight": 0.2,
        "metrics": [
          {
            "key": "engineering_practices",
            "band": "critical",
            "name": "Engineering practices",
            "note": null,
            "notes": [],
            "value": 24,
            "inputs": {
              "has_ci": false,
              "has_tests": true,
              "has_editorconfig": false,
              "has_linter_config": false,
              "has_precommit_config": false
            },
            "components": [
              {
                "key": "ci_workflows",
                "name": "CI workflows",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 24
              },
              {
                "key": "tests_present",
                "name": "Tests present",
                "detail": null,
                "points": 24,
                "status": "met",
                "details": [],
                "max_points": 24
              },
              {
                "key": "linter_config",
                "name": "Linter config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 16
              },
              {
                "key": "pre_commit_hooks",
                "name": "Pre-commit hooks",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 9.6
              },
              {
                "key": "editorconfig",
                "name": ".editorconfig",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 6.4
              },
              {
                "key": "openssf_scorecard_ci_tests",
                "name": "OpenSSF Scorecard: CI-Tests",
                "detail": "0 out of 5 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              }
            ]
          },
          {
            "key": "documentation",
            "band": "moderate",
            "name": "Documentation",
            "note": null,
            "notes": [],
            "value": 50,
            "inputs": {
              "topics": [],
              "has_wiki": true,
              "homepage": null,
              "has_readme": true,
              "has_docs_dir": false,
              "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": 0,
                "status": "missed",
                "details": [],
                "max_points": 25
              },
              {
                "key": "documentation_homepage_site",
                "name": "Documentation / homepage site",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "repository_description",
                "name": "Repository description",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              },
              {
                "key": "topics",
                "name": "Topics",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 10
              },
              {
                "key": "wiki",
                "name": "Wiki",
                "detail": null,
                "points": 10,
                "status": "met",
                "details": [],
                "max_points": 10
              }
            ]
          }
        ],
        "description": "Are baseline engineering and documentation practices in place?"
      },
      {
        "key": "security",
        "band": "critical",
        "name": "Security",
        "value": 17,
        "weight": 0.16,
        "metrics": [
          {
            "key": "security_posture",
            "band": "critical",
            "name": "Security posture",
            "note": "Excluded from scoring (no data or not applicable): Dangerous-Workflow, Packaging, Pinned-Dependencies, Signed-Releases, Token-Permissions. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "dangerous_workflow",
                    "packaging",
                    "pinned_dependencies",
                    "signed_releases",
                    "token_permissions"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 17,
            "inputs": {
              "source": "openssf_scorecard",
              "checks_evaluated": 13,
              "scorecard_version": "v5.5.0",
              "checks_inconclusive": 5,
              "scorecard_aggregate": 1.6
            },
            "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": "0 out of 5 merged PRs checked by a CI test -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "cii_best_practices",
                "name": "CII-Best-Practices",
                "detail": "no effort to earn an OpenSSF best practices badge detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "code_review",
                "name": "Code-Review",
                "detail": "Found 0/9 approved changesets -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "contributors",
                "name": "Contributors",
                "detail": "project has 1 contributing companies or organizations -- score normalized to 3",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "dangerous_workflow",
                "name": "Dangerous-Workflow",
                "detail": "no workflows found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              },
              {
                "key": "dependency_update_tool",
                "name": "Dependency-Update-Tool",
                "detail": "no update tool detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "fuzzing",
                "name": "Fuzzing",
                "detail": "project is not fuzzed",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "license",
                "name": "License",
                "detail": "license file detected",
                "points": 2.5,
                "status": "met",
                "details": [],
                "max_points": 2.5
              },
              {
                "key": "maintained",
                "name": "Maintained",
                "detail": "project was created within the last 90 days. Please review its contents carefully",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 7.5
              },
              {
                "key": "packaging",
                "name": "Packaging",
                "detail": "packaging workflow not detected",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "pinned_dependencies",
                "name": "Pinned-Dependencies",
                "detail": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 5
              },
              {
                "key": "sast",
                "name": "SAST",
                "detail": "SAST tool is not run on all commits -- score normalized to 0",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "security_policy",
                "name": "Security-Policy",
                "detail": "security policy file not detected",
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 5
              },
              {
                "key": "signed_releases",
                "name": "Signed-Releases",
                "detail": "no releases found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "token_permissions",
                "name": "Token-Permissions",
                "detail": "No tokens found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 7.5
              },
              {
                "key": "vulnerabilities",
                "name": "Vulnerabilities",
                "detail": "9 existing vulnerabilities detected",
                "points": 0.8,
                "status": "partial",
                "details": [],
                "max_points": 7.5
              }
            ]
          }
        ],
        "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": 57,
        "weight": 0,
        "metrics": [
          {
            "key": "ai_agent_context",
            "band": "at_risk",
            "name": "Agent context & guidance",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "has_llms_txt": false,
              "legible_history_share": 0.933,
              "agent_instruction_files": [],
              "agent_instruction_max_bytes": null
            },
            "components": [
              {
                "key": "agent_instructions",
                "name": "Agent instructions",
                "detail": "no CLAUDE.md / AGENTS.md / editor rules",
                "points": 0,
                "status": "missed",
                "details": [
                  {
                    "code": "no_agent_instructions",
                    "params": {}
                  }
                ],
                "max_points": 45
              },
              {
                "key": "machine_readable_docs_llms_txt",
                "name": "Machine-readable docs (llms.txt)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 15
              },
              {
                "key": "legible_commit_history",
                "name": "Legible commit history",
                "detail": "56 of 60 human commits state their intent (structured subject or explanatory body)",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "legible_history",
                    "params": {
                      "legible": 56,
                      "sampled": 60
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          },
          {
            "key": "ai_verify_loop",
            "band": "moderate",
            "name": "Verify loop (build / test / typecheck)",
            "note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: Pinned-Dependencies. Remaining weights renormalized.",
            "notes": [
              {
                "code": "excluded_no_data",
                "params": {
                  "components": [
                    "openssf_scorecard_pinned_dependencies"
                  ]
                }
              },
              {
                "code": "weights_renormalized",
                "params": {}
              }
            ],
            "value": 59,
            "inputs": {
              "has_nix": false,
              "has_tests": true,
              "lockfiles": [
                "package-lock.json"
              ],
              "has_dockerfile": false,
              "typed_language": true,
              "bootstrap_files": [],
              "has_devcontainer": false,
              "has_linter_config": false,
              "typecheck_configs": [
                "tsconfig.json"
              ],
              "agent_commit_share": 0.367,
              "toolchain_manifests": [],
              "dependency_bot_commit_share": 0
            },
            "components": [
              {
                "key": "one_command_bootstrap",
                "name": "One-command bootstrap",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 18
              },
              {
                "key": "automated_tests",
                "name": "Automated tests",
                "detail": null,
                "points": 22,
                "status": "met",
                "details": [],
                "max_points": 22
              },
              {
                "key": "lint_format_config",
                "name": "Lint / format config",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 11
              },
              {
                "key": "static_type_checking",
                "name": "Static type checking",
                "detail": "tsconfig.json",
                "points": 11,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "tsconfig.json"
                    }
                  }
                ],
                "max_points": 11
              },
              {
                "key": "reproducible_environment",
                "name": "Reproducible environment",
                "detail": "lockfile",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "lockfile"
                    }
                  }
                ],
                "max_points": 10
              },
              {
                "key": "demonstrated_agent_practice",
                "name": "Demonstrated agent practice",
                "detail": "22 of the last 60 commits agent-authored or agent-credited",
                "points": 10,
                "status": "met",
                "details": [
                  {
                    "code": "agent_authored_commits",
                    "params": {
                      "count": 22,
                      "sampled": 60
                    }
                  }
                ],
                "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": "no dependencies found",
                "points": 0,
                "status": "excluded",
                "details": [
                  {
                    "code": "no_data",
                    "params": {}
                  }
                ],
                "max_points": 10
              }
            ]
          },
          {
            "key": "ai_code_legibility",
            "band": "excellent",
            "name": "Code legibility for models",
            "note": null,
            "notes": [],
            "value": 100,
            "inputs": {
              "primary_language": "TypeScript",
              "largest_source_bytes": 23316,
              "source_files_sampled": 22,
              "oversized_source_files": 0
            },
            "components": [
              {
                "key": "type_checkable_code",
                "name": "Type-checkable code",
                "detail": "TypeScript (statically typed)",
                "points": 45,
                "status": "met",
                "details": [
                  {
                    "code": "statically_typed_language",
                    "params": {
                      "language": "TypeScript"
                    }
                  }
                ],
                "max_points": 45
              },
              {
                "key": "manageable_file_sizes",
                "name": "Manageable file sizes",
                "detail": "0/22 source files over 60KB",
                "points": 55,
                "status": "met",
                "details": [
                  {
                    "code": "oversized_source_files",
                    "params": {
                      "kb": 60,
                      "sampled": 22,
                      "oversized": 0
                    }
                  }
                ],
                "max_points": 55
              }
            ]
          },
          {
            "key": "ai_interfaces",
            "band": "at_risk",
            "name": "Machine-readable interfaces",
            "note": null,
            "notes": [],
            "value": 40,
            "inputs": {
              "example_dirs": [
                "examples"
              ],
              "has_mcp_signal": false,
              "api_schema_files": []
            },
            "components": [
              {
                "key": "api_schema_openapi_graphql_proto",
                "name": "API schema (OpenAPI/GraphQL/proto)",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 40
              },
              {
                "key": "mcp_server",
                "name": "MCP server",
                "detail": null,
                "points": 0,
                "status": "missed",
                "details": [],
                "max_points": 20
              },
              {
                "key": "runnable_examples",
                "name": "Runnable examples",
                "detail": "examples",
                "points": 40,
                "status": "met",
                "details": [
                  {
                    "code": "file_list",
                    "params": {
                      "files": "examples"
                    }
                  }
                ],
                "max_points": 40
              }
            ]
          }
        ],
        "description": "How well is the repo equipped to be developed and maintained with AI coding agents? An independent, experimental badge — weight 0.0, so it is surfaced on its own and does not affect the overall health score."
      }
    ],
    "metrics_version": "1.13.0"
  },
  "warnings": [
    "Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
    "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
    "deps.dev does not index npm:@xtraceai/memory@0.5.0; advisories assessed against the repository dependency graph instead"
  ],
  "report_type": "repository",
  "generated_at": "2026-07-23T06:40:37.908397Z",
  "schema_version": "0.27.0",
  "badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/x/XTraceAI/memory-sdk-ts.svg",
  "full_name": "XTraceAI/memory-sdk-ts",
  "license_state": "standard",
  "license_spdx": "MIT"
}

评分是信号,而非担保。 评分反映的是 GitHub 上公开可见的实践——不是代码审计,也不是安全保证。

缺失数据将被剔除并重新归一化权重,绝不按零分计。方法论已版本化并公开:指标 v1.13.0、模式 v0.27.0—— 完整方法论 · 指标知识库.

单项结果在整体记录中的位置: 汇总统计npm.