Registro público
Informe de salud del softwareesquema 0.27.0 · métricas 1.13.0 · 2026-07-23 06:40 UTC

XTraceAI / memory-sdk-ts

TypeScript SDK for the xtrace memory API

TypeScriptMIT★ 274 estrellas⑂ 34 forksdesde may 2026Ver en GitHub ↗

XTraceAI/memory-sdk-ts tiene un índice de salud de 47 sobre 100, lo que lo sitúa en la banda En riesgo. Su puntuación más alta es Vitality (70/100) y la más baja, Security (17/100). Se actualizó por última vez hace 5 días. Una sola persona concentra la mayor parte del trabajo reciente.

47
global / 100
En riesgo

Índice de salud del software

Las métricas se agrupan en categorías ponderadas sobre una escala de 1 a 100. El resultado global parte de su media; cuando la evidencia pública activa la Política de Jurisdicciones de Alto Riesgo, la calificación se ajusta y recibe el límite 49 (En riesgo). Preparación para IA queda fuera.

47
Excelente85-100Ejemplar; cumple prácticamente todos los criterios evaluados
Bueno70-84Saludable; carencias menores
Moderado50-69Aceptable con carencias notables; se recomienda revisión
En riesgo30-49Debilidades significativas; su adopción exige cautela
Crítico1-29Problemas graves (proyecto abandonado, un solo mantenedor, sin higiene)
VitalidadComunidad yAdopciónSostenibilidady GobernanzaCalidad deIngenieríaSeguridadPreparaciónpara IA

Perfil de puntuación

Cada eje es una categoría. La forma importa más que la media: un proyecto sano llena toda la figura, mientras que un perfil de picos y cráteres indica que la fortaleza en una dimensión enmascara el riesgo en otra.

Titularidad

XTraceAIOrganización
3 seguidores6 repositorios públicosdesde may 2024

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

Ecosistemas de paquetes

RegistroPaqueteVersiónDescargas / mesVersionesÚltima publicaciónEtiquetas
npm@xtraceai/memory0.5.050249hace 5 díasxtracememorysdkaiagentai-sdkvercel-ai-sdk

Métricas por categoría

Vitalidad

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

70Bueno · 22% del índice global
Cómo se puntúa
36/36Recencia de push — último push hace 5 días
5.5/36Cadencia de commits — 8/52 semanas con commits
16/18Volumen de commits — 60 commits en el último año
0/10OpenSSF Scorecard: Maintained — project was created within the last 90 days. Please review its contents carefully
Datos de entrada utilizados
commits_last_year60
human_commit_share1
days_since_last_push5
active_weeks_last_year8
Cómo se puntúa
16.2/27Publica versiones — 6 etiquetas de versión (sin releases de GitHub)
36/36Recencia de las versiones — última versión hace 5 días
27/27Cadencia de publicación — una versión cada ~10,2 días
0/10OpenSSF Scorecard: Signed-Releases — sin datos
Datos de entrada utilizados
releases_count6
latest_release_tagv0.5.0
releases_from_tags
days_since_latest_release5
mean_days_between_releases10,2
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Signed-Releases. Los pesos restantes se han renormalizado.

Comunidad y Adopción

¿Tiene el proyecto usuarios, descargas, atención y unas condiciones acogedoras para quienes contribuyen?

54Moderado · 18% del índice global
Cómo se puntúa
39.5/60Estrellas — 274 estrellas
12.7/25Forks — 34 forks
0/15Observadores — 1 observadores
Datos de entrada utilizados
forks34
stars274
watchers1
growth_stateunverified
growth_factor_pct100
growth_unverified_reasonno_history
Cómo se puntúa
22.5/22.5README
22.5/22.5Licencia — licencia reconocida (MIT)
0/18Guía CONTRIBUTING
0/13.5Código de conducta
0/7.2Plantilla de issues
0/6.3Plantilla de PR
Datos de entrada utilizados
has_readme
has_license
has_contributingno
has_issue_templateno
has_code_of_conductno
has_pull_request_templateno
Cómo se puntúa
49.3/80Descargas mensuales — 5024 descargas/mes en npm
0/20Dependientes en el registro — no lo informa este ecosistema
Datos de entrada utilizados
packages@xtraceai/memory
dependents
ecosystemsnpm
total_downloads
monthly_downloads5024
Excluidos de la puntuación (sin datos o no aplicable): Dependientes en el registro. Los pesos restantes se han renormalizado.

Sostenibilidad y Gobernanza

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

51Moderado · 24% del índice global
Cómo se puntúa
9/54Factor bus — la mitad de los commits recae en 1 contribuyente(s)
4.5/22.5Distribución de commits — el principal contribuyente firma el 80% de los commits
5.4/13.5Amplitud de contribuyentes — 4 contribuyentes
3/10OpenSSF Scorecard: Contributors — project has 1 contributing companies or organizations -- score normalized to 3
Datos de entrada utilizados
bus_factor1
contributors_sampled4
top_contributor_share0,8
Cómo se puntúa
0/46.8Resolución de issues — sin issues o sin datos
27.3/38.3Aceptación de PR — 10/14 PR decididos fusionados
0/15OpenSSF Scorecard: Code-Review — Found 0/9 approved changesets -- score normalized to 0
Datos de entrada utilizados
merged_prs10
open_issues0
closed_issues0
issue_closed_ratio
closed_unmerged_prs4
Excluidos de la puntuación (sin datos o no aplicable): Resolución de issues. Los pesos restantes se han renormalizado.
Cómo se puntúa
30/30Respaldo de la propiedad — propiedad de una organización
0/20Dominio verificado
4.3/25Alcance del propietario — 3 seguidores de XTraceAI
10.5/25Trayectoria — 6 repos públicos, cuenta de ~2 años
Datos de entrada utilizados
followers3
owner_typeOrganization
is_verified
owner_loginXTraceAI
public_repos6
account_age_days786
Cómo se puntúa
25/25Publicado y resoluble — 1 paquete(s) en npm
35/35Recencia de publicación — última publicación hace 5 días
20/20Historial de versiones — 9 versiones en el registro
20/20No obsoleto — activo, ni obsoleto ni retirado
Datos de entrada utilizados
packages@xtraceai/memory
ecosystemsnpm
any_deprecatedno
min_days_since_publish5

Calidad de Ingeniería

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

34En riesgo · 20% del índice global
Cómo se puntúa
0/24Flujos de trabajo de CI
24/24Pruebas presentes
0/16Configuración de linter
0/9.6Hooks de pre-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
Datos de entrada utilizados
has_cino
has_tests
has_editorconfigno
has_linter_configno
has_precommit_configno

Documentación

50Moderado
Cómo se puntúa
30/30README
0/25Directorio de documentación
0/15Sitio de documentación / página del proyecto
10/10Descripción del repositorio
0/10Topics
10/10Wiki
Datos de entrada utilizados
topics
has_wiki
homepage
has_readme
has_docs_dirno
has_description

Seguridad

¿Son sólidas las prácticas visibles de seguridad y de cadena de suministro, sin exposición jurisdiccional de alto riesgo sin resolver?

17Crítico · 16% del índice global
Cómo se puntúa
7.5/7.5Binary-Artifacts — no binaries found in the repo
0/7.5Branch-Protection — branch protection not enabled on development/release branches
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 — sin datos
0/7.5Dependency-Update-Tool — no update tool detected
0/5Fuzzing — project is not fuzzed
2.5/2.5Licencia — license file detected
0/7.5Maintained — project was created within the last 90 days. Please review its contents carefully
0/5Packaging — sin datos
0/5Pinned-Dependencies — sin datos
0/5SAST — SAST tool is not run on all commits -- score normalized to 0
0/5Security-Policy — security policy file not detected
0/7.5Signed-Releases — sin datos
0/7.5Token-Permissions — sin datos
0.8/7.5Vulnerabilities — 9 existing vulnerabilities detected
Datos de entrada utilizados
sourceopenssf_scorecard
checks_evaluated13
scorecard_versionv5.5.0
checks_inconclusive5
scorecard_aggregate1,6
Excluidos de la puntuación (sin datos o no aplicable): dangerous_workflow, packaging, pinned_dependencies, signed_releases, token_permissions. Los pesos restantes se han renormalizado.

Preparación para IA

¿Hasta qué punto está el repositorio preparado para desarrollarse y mantenerse con agentes de codificación de IA? Es una insignia independiente y experimental — peso 0,0, de modo que se presenta por separado y no afecta a la puntuación de salud global.

57Moderado · 0% del índice global
Cómo se puntúa
0/45Instrucciones para agentes — sin CLAUDE.md / AGENTS.md / reglas de editor
0/15Documentación legible por máquinas (llms.txt)
40/40Historial de commits legible — 56 de 60 commits humanos declaran su intención (asunto estructurado o cuerpo explicativo)
Datos de entrada utilizados
has_llms_txtno
legible_history_share0,933
agent_instruction_files
agent_instruction_max_bytes
Cómo se puntúa
0/18Arranque con un solo comando
22/22Pruebas automatizadas
0/11Configuración de lint / formato
11/11Verificación estática de tipos — tsconfig.json
10/10Entorno reproducible — lockfile
10/10Práctica demostrada con agentes — 22 de los últimos 60 commits con autoría o crédito de agente
0/8Mantenimiento automatizado — no se observan actualizaciones automáticas de dependencias
0/10OpenSSF Scorecard: Pinned-Dependencies — sin datos
Datos de entrada utilizados
has_nixno
has_tests
lockfilespackage-lock.json
has_dockerfileno
typed_language
bootstrap_files
has_devcontainerno
has_linter_configno
typecheck_configstsconfig.json
agent_commit_share0,367
toolchain_manifests
dependency_bot_commit_share0
Excluidos de la puntuación (sin datos o no aplicable): OpenSSF Scorecard: Pinned-Dependencies. Los pesos restantes se han renormalizado.
Cómo se puntúa
45/45Código verificable por tipos — TypeScript (tipado estático)
55/55Tamaños de archivo manejables — 0/22 archivos fuente de más de 60 KB
Datos de entrada utilizados
primary_languageTypeScript
largest_source_bytes23.316
source_files_sampled22
oversized_source_files0
Cómo se puntúa
0/40Esquema de API (OpenAPI/GraphQL/proto)
0/20Servidor MCP
40/40Ejemplos ejecutables — examples
Datos de entrada utilizados
example_dirsexamples
has_mcp_signalno
api_schema_files

Datos clave

274estrellas de GitHub
4contribuidores
60commits en los últimos 12 meses
5días desde el último push
6versiones publicadas
1factor bus
0issues abiertas
npmecosistemas de paquetes

Advertencias de recopilación de datos

  • 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

Más detalle

Historial de estrellas y forks 0 ★ / 34 ⇿
0Estrellas
34Forks
2Versiones

Cuándo se añadió cada estrella y fork, recopilado de GitHub y agrupado por día. El crecimiento acumulado se sitúa justo encima de las adiciones diarias que lo componen, de modo que ambos se leen en conjunto: la acumulación orgánica sostenida no se parece en nada a un pico abrupto y efímero. Cuando esa diferencia es medible, se informa como autenticidad del crecimiento.

152025303534192026-052026-062026-06
Mayor 0Menor 1Parche 1
OpenSSF Scorecard 1.6 / 10
1.6agregado

Evaluación de seguridad independiente y agnóstica en cuanto a herramientas, procedente del proyecto de código abierto OpenSSF Scorecard. Cada comprobación premia una práctica de seguridad, no la herramienta de un proveedor concreto. Las comprobaciones que Scorecard no pudo determinar se marcan como n/d y se excluyen de la puntuación de seguridad (nunca se cuentan como cero).Scorecard v5.5.0 · 2026-07-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
n/dDangerous-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
n/dPackagingpackaging workflow not detected
n/dPinned-Dependenciesno dependencies found
0SASTSAST tool is not run on all commits -- score normalized to 0
0Security-Policysecurity policy file not detected
n/dSigned-Releasesno releases found
n/dToken-PermissionsNo tokens found
1Vulnerabilities9 existing vulnerabilities detected
Todas las dependencias no recopilado

No fue posible recopilar el conjunto de dependencias resuelto para este informe: GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository

Informe JSON sin procesar legible por máquina
{
  "data": {
    "repo": {
      "topics": [],
      "is_fork": false,
      "size_kb": 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"
}

Las puntuaciones son señales, no garantías. Reflejan prácticas públicamente visibles en GitHub; no son una auditoría de código ni una garantía de seguridad.

Los datos ausentes se excluyen y los pesos se renormalizan; nunca se puntúan como cero. La metodología es versionada y abierta: métricas v1.13.0, esquema v0.27.0 — metodología completa · wiki de métricas.

Cómo se sitúa un resultado dentro del registro general: estadísticas agregadasnpm.