enigma-memory 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/benchmark-reproducibility.md +8 -6
- package/docs/developer-ecosystem.md +1 -1
- package/docs/memory-benchmarks.md +13 -7
- package/docs/sdk-api.md +1 -1
- package/package.json +1 -1
- package/packages/mcp-server/src/index.js +1 -1
- package/packages/passport/src/index.js +125 -4
- package/scripts/build-installer-assets.mjs +1 -1
- package/scripts/run-memory-benchmarks.mjs +11 -0
|
@@ -4,7 +4,7 @@ This guide explains how to reproduce the current local Enigma memory benchmark,
|
|
|
4
4
|
|
|
5
5
|
## What is reproducible today
|
|
6
6
|
|
|
7
|
-
The current package is `enigma-memory@0.1.
|
|
7
|
+
The current package is `enigma-memory@0.1.4`. The local benchmark is available through the package script and the script file it wraps:
|
|
8
8
|
|
|
9
9
|
```sh
|
|
10
10
|
cd enigma
|
|
@@ -19,7 +19,7 @@ The report schema is `enigma.memory_benchmark_suite.v1`. It is designed to be pu
|
|
|
19
19
|
|
|
20
20
|
## Reproduce and save JSON
|
|
21
21
|
|
|
22
|
-
1. Use a clean checkout containing `enigma-memory@0.1.
|
|
22
|
+
1. Use a clean checkout containing `enigma-memory@0.1.4`.
|
|
23
23
|
2. From a repository root that contains `enigma/package.json`, enter the package directory:
|
|
24
24
|
|
|
25
25
|
```sh
|
|
@@ -40,10 +40,12 @@ The report schema is `enigma.memory_benchmark_suite.v1`. It is designed to be pu
|
|
|
40
40
|
npm run benchmark:memory-suite -- --out benchmark-report.json
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
5. Preserve the JSON file with the command, package version, operating system/runtime, and review context that produced it.
|
|
43
|
+
5. Preserve the JSON file with the command, package version, operating system/runtime, hardware class when relevant, and review context that produced it.
|
|
44
44
|
6. When sharing the result publicly, share the generated JSON report only after confirming it still has `public_safe: true` and `schema: "enigma.memory_benchmark_suite.v1"`.
|
|
45
45
|
|
|
46
|
-
The local fixture measures Enigma-controlled operations only: vault remember/update, vault export/import, passport context-pack retrieval, optimizer token estimates and duplicate removal, bundle/context-pack verification, abstention behavior, exact-answer recall over the deterministic fixture, and p50/p95 operation latency from `performance.now`.
|
|
46
|
+
The local fixture measures Enigma-controlled operations only: vault remember/update, vault export/import, passport context-pack retrieval, deterministic local relevance filtering before optimizer tiering, optimizer token estimates and duplicate removal, bundle/context-pack verification, abstention behavior, exact-answer recall over the deterministic fixture, and p50/p95 operation latency from `performance.now`.
|
|
47
|
+
|
|
48
|
+
Interpret improvements as local fixture behavior. Enigma reduces context-pack estimated prompt tokens by selecting the deterministic query/purpose/address-relevant local memories before optimizer tiering and deduplication; it does not measure provider invoice savings, token ROI, live model quality, or third-party memory superiority. Token estimates and p50/p95 timings can change across hardware, Node/runtime versions, script revisions, and fixture updates.
|
|
47
49
|
|
|
48
50
|
## Local baseline rows in the report
|
|
49
51
|
|
|
@@ -54,7 +56,7 @@ The report now includes `metrics.local_baseline_comparisons`, which compares det
|
|
|
54
56
|
| `full_context` | Supplies every active fixture memory without optimization or deduplication. |
|
|
55
57
|
| `recency_last_n` | Supplies the three most recently updated active fixture memories. |
|
|
56
58
|
| `keyword_filter` | Supplies active fixture memories whose content or tags match deterministic query terms. |
|
|
57
|
-
| `enigma_context_pack` | Uses the Enigma passport context-pack compiler
|
|
59
|
+
| `enigma_context_pack` | Uses the Enigma passport context-pack compiler with deterministic local relevance filtering before optimizer tiering and deduplication. |
|
|
58
60
|
|
|
59
61
|
The report also includes `public_claims_allowed`; keep public copy within those local-fixture boundaries unless separate reviewed external evidence exists.
|
|
60
62
|
|
|
@@ -71,7 +73,7 @@ The current local report mirrors some task categories from those benchmarks, but
|
|
|
71
73
|
|
|
72
74
|
The current benchmark does not call external provider APIs, external SDKs, hosted memory services, ChatGPT native memory, Claude memory tooling, or third-party agent loops. Cross-provider rows in the report are profile labels that reuse the same Enigma context-pack boundary; they do not call or compare live provider models and are not live provider rankings.
|
|
73
75
|
|
|
74
|
-
Real comparisons require fixed adapters, fixed datasets, fixed agent/tool loops, explicit provider terms review, and reviewed handling of secrets and raw benchmark data. Memory quality can change with the surrounding agent framework and tool loop, so a fair comparison must document more than the memory store.
|
|
76
|
+
Real comparisons require fixed adapters, fixed datasets, fixed agent/tool loops, explicit provider terms review, and reviewed handling of secrets and raw benchmark data. Memory quality can change with the surrounding agent framework and tool loop, so a fair comparison must document more than the memory store. Until those inputs exist, external competitor rows stay requirements-only and must not carry recall, abstention, token, latency, or ranking scores.
|
|
75
77
|
|
|
76
78
|
The current report must not be used as evidence of provider-side deletion, model forgetting, compliance certification, token ROI, provider invoice savings, benchmark leadership, hosted-cloud readiness, or “best in world” superiority.
|
|
77
79
|
|
|
@@ -25,7 +25,7 @@ The example app prints ids, counts, roots, and verification status only. It does
|
|
|
25
25
|
|
|
26
26
|
## CLI and CI loop
|
|
27
27
|
|
|
28
|
-
The CI example installs Node 24, installs the published `enigma-memory@0.1.
|
|
28
|
+
The CI example installs Node 24, installs the published `enigma-memory@0.1.4` package, runs:
|
|
29
29
|
|
|
30
30
|
```sh
|
|
31
31
|
npx enigma quickstart --overwrite
|
|
@@ -26,30 +26,34 @@ The harness measures local Enigma operations only:
|
|
|
26
26
|
|
|
27
27
|
- vault remember/update operations;
|
|
28
28
|
- vault export and import;
|
|
29
|
-
- context-pack retrieval through the passport package;
|
|
30
|
-
- optimizer plan token estimates and duplicate removal;
|
|
29
|
+
- context-pack retrieval through the passport package, including deterministic local relevance filtering before optimizer tiering;
|
|
30
|
+
- optimizer plan token estimates, tiering, and duplicate removal;
|
|
31
31
|
- bundle and context-pack verification;
|
|
32
32
|
- local baseline comparisons over the same deterministic fixture questions;
|
|
33
33
|
- p50/p95 latency with `performance.now`.
|
|
34
34
|
|
|
35
35
|
Reported metrics include exact-answer recall, abstention correctness, estimated prompt tokens, duplicate candidates removed where applicable, operation latency summaries, verification status, and same-boundary cross-provider profile rows.
|
|
36
36
|
|
|
37
|
+
Enigma context-pack token improvements are achieved by local selection, not external-provider behavior: the passport compiler narrows active local memories to the deterministic query/purpose/address-relevant set before optimizer tiering and deduplication. This lowers estimated prompt tokens by excluding locally irrelevant fixture memories while preserving the same recall and abstention scoring boundary.
|
|
38
|
+
|
|
39
|
+
Numeric token and latency values in generated reports are local fixture measurements. They can change with hardware, Node/runtime version, script version, and fixture contents, so copy should cite the command and report artifact rather than treating one run as a universal score.
|
|
40
|
+
|
|
37
41
|
## Local baseline comparison
|
|
38
42
|
|
|
39
|
-
`metrics.local_baseline_comparisons` compares Enigma against deterministic local baselines only. Every row scores the same private fixture questions and keeps raw memory, question text, and answer text out of the report.
|
|
43
|
+
`local_baseline_comparisons` (also mirrored at `metrics.local_baseline_comparisons`) compares Enigma against deterministic local baselines only. Every row scores the same private fixture questions and keeps raw memory, question text, and answer text out of the report.
|
|
40
44
|
|
|
41
45
|
| Row | Boundary | Reported fields |
|
|
42
46
|
| --- | --- | --- |
|
|
43
47
|
| `full_context` | Supplies every active fixture memory without optimization or deduplication. | Recall, abstention correctness, estimated prompt tokens, selected memory count, p50/p95 local latency. |
|
|
44
48
|
| `recency_last_n` | Supplies the three most recently updated active fixture memories. | Same fields; duplicate removal is marked not applicable. |
|
|
45
49
|
| `keyword_filter` | Supplies active fixture memories whose content or tags match deterministic query terms. | Same fields; duplicate removal is marked not applicable. |
|
|
46
|
-
| `enigma_context_pack` | Uses the Enigma passport context-pack compiler
|
|
50
|
+
| `enigma_context_pack` | Uses the Enigma passport context-pack compiler with deterministic local relevance filtering before optimizer tiering and deduplication. | Same fields plus duplicate-removal counts from the Enigma optimizer plan. |
|
|
47
51
|
|
|
48
52
|
These rows are local package evidence only. They do not compare hosted providers, do not use provider APIs, and do not support invoice savings, ROI, compliance, model-forgetting, or benchmark-leadership claims.
|
|
49
53
|
|
|
50
54
|
## External competitor adapter requirements
|
|
51
55
|
|
|
52
|
-
`external_competitor_adapters` is a requirements matrix, not a score table. Each row has `status: "not_run_requires_credentials_or_runtime"`, `can_run_in_this_harness: false`, `required_artifacts`, `official_doc`, an exact `boundary_reason`, and `scores_included: false`.
|
|
56
|
+
`external_competitor_adapters` is a requirements matrix, not a score table. Each row has `status: "not_run_requires_credentials_or_runtime"`, `can_run_in_this_harness: false`, `required_artifacts`, `official_doc`, `official_positioning`, an exact `boundary_reason`, and `scores_included: false`.
|
|
53
57
|
|
|
54
58
|
| Adapter | Official source | Required artifacts before scoring | Boundary reason |
|
|
55
59
|
| --- | --- | --- | --- |
|
|
@@ -60,11 +64,13 @@ These rows are local package evidence only. They do not compare hosted providers
|
|
|
60
64
|
| OpenAI ChatGPT native memory | https://help.openai.com/en/articles/8590148-memory-faq | ChatGPT account/runtime with native memory enabled; account-safe evaluation protocol; dataset prompts; evidence capture that excludes personal data and credentials. | ChatGPT native memory is a consumer-app feature rather than a public API surface available to this local package harness. |
|
|
61
65
|
| Claude memory tool | https://support.anthropic.com/en/articles/11145838-using-claude-memory | Claude/provider runtime with the memory tool available; client-side tool configuration; fixed model/tool-use policy/prompts/dataset mapping; safe evidence capture. | The memory tool is provider/client-side and requires a Claude runtime plus tool environment that this benchmark does not control. |
|
|
62
66
|
|
|
63
|
-
No external adapter row contains recall, abstention, token, latency, or ranking scores. Third-party
|
|
67
|
+
No external adapter row contains recall, abstention, token, latency, or ranking scores. Third-party rows remain requirements-only until the required credentials, runtimes, fixed agent/tool loops, and reviewed datasets are supplied and reviewed.
|
|
68
|
+
|
|
69
|
+
The `official_positioning` field records only source-attributed context needed to build a future adapter: Letta/MemGPT runtime and SDK/API-key requirements; LangGraph short-term checkpointer and long-term namespaced store memory; Zep temporal Context Graph/Context Lake positioning and retrieval-latency claim; Mem0 platform/open-source memory stack; OpenAI native consumer-app memory; and Claude provider/client-side memory tooling. None of those facts are scored or verified by this local run.
|
|
64
70
|
|
|
65
71
|
## Claim limits
|
|
66
72
|
|
|
67
|
-
The benchmark report is evidence for this local deterministic fixture only.
|
|
73
|
+
The benchmark report is evidence for this local deterministic fixture only. Reported score improvements mean Enigma selected fewer locally irrelevant context-pack candidates under the same fixture questions; they are not provider deletion proof, model forgetting proof, compliance certification, ROI evidence, provider invoice savings evidence, benchmark leadership proof, hosted cloud readiness, or a substitute for external LoCoMo/LongMemEval evaluation.
|
|
68
74
|
|
|
69
75
|
Cross-provider rows are profile labels using the same Enigma context-pack boundary. External competitor rows are adapter requirements only; they do not call, score, or rank live provider models.
|
|
70
76
|
|
package/docs/sdk-api.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SDK and API guide
|
|
2
2
|
|
|
3
|
-
This guide covers the public package imports for `enigma-memory@0.1.
|
|
3
|
+
This guide covers the public package imports for `enigma-memory@0.1.4`. The SDK runs locally by default: vaults, passports, context packs, receipts, relay/gateway demo state, storage contracts, metering artifacts, and settlement artifacts are package-level developer surfaces. They are not evidence of hosted Enigma cloud, provider-side deletion, provider model forgetting, token ROI, invoice savings, compliance certification, or benchmark leadership.
|
|
4
4
|
|
|
5
5
|
## Install and import style
|
|
6
6
|
|
package/package.json
CHANGED
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
const DEFAULT_BUNDLE = '.enigma/bundle.json';
|
|
18
18
|
const JSONRPC_VERSION = '2.0';
|
|
19
19
|
const MCP_PROTOCOL_VERSION = '2024-11-05';
|
|
20
|
-
const SERVER_INFO = Object.freeze({ name: 'enigma-mcp-server', version: '0.1.
|
|
20
|
+
const SERVER_INFO = Object.freeze({ name: 'enigma-mcp-server', version: '0.1.4' });
|
|
21
21
|
const JSON_RPC_ID_PATTERN = /^[A-Za-z0-9._:-]{1,128}$/;
|
|
22
22
|
const JSON_RPC_ERROR = Object.freeze({
|
|
23
23
|
INVALID_REQUEST: -32600,
|
|
@@ -36,6 +36,125 @@ const PUBLIC_PLAINTEXT_KEYS = new Set(['body', 'content', 'context', 'contexttex
|
|
|
36
36
|
const SOURCE_REF_ROOT_RE = /^sha256:[a-f0-9]{64}$/;
|
|
37
37
|
const PUBLIC_KEY_REQUIRED_FOR_CONTEXT_PACK_VERIFICATION = 'PUBLIC_KEY_REQUIRED_FOR_CONTEXT_PACK_VERIFICATION';
|
|
38
38
|
|
|
39
|
+
const QUERY_RELEVANCE_STOPWORDS = new Set([
|
|
40
|
+
'about',
|
|
41
|
+
'after',
|
|
42
|
+
'again',
|
|
43
|
+
'against',
|
|
44
|
+
'also',
|
|
45
|
+
'and',
|
|
46
|
+
'any',
|
|
47
|
+
'are',
|
|
48
|
+
'assistant',
|
|
49
|
+
'because',
|
|
50
|
+
'been',
|
|
51
|
+
'before',
|
|
52
|
+
'being',
|
|
53
|
+
'between',
|
|
54
|
+
'can',
|
|
55
|
+
'could',
|
|
56
|
+
'current',
|
|
57
|
+
'does',
|
|
58
|
+
'from',
|
|
59
|
+
'has',
|
|
60
|
+
'have',
|
|
61
|
+
'how',
|
|
62
|
+
'into',
|
|
63
|
+
'its',
|
|
64
|
+
'latest',
|
|
65
|
+
'more',
|
|
66
|
+
'most',
|
|
67
|
+
'number',
|
|
68
|
+
'own',
|
|
69
|
+
'owns',
|
|
70
|
+
'please',
|
|
71
|
+
'should',
|
|
72
|
+
'that',
|
|
73
|
+
'the',
|
|
74
|
+
'their',
|
|
75
|
+
'then',
|
|
76
|
+
'there',
|
|
77
|
+
'these',
|
|
78
|
+
'they',
|
|
79
|
+
'this',
|
|
80
|
+
'use',
|
|
81
|
+
'using',
|
|
82
|
+
'was',
|
|
83
|
+
'what',
|
|
84
|
+
'when',
|
|
85
|
+
'where',
|
|
86
|
+
'which',
|
|
87
|
+
'who',
|
|
88
|
+
'whose',
|
|
89
|
+
'why',
|
|
90
|
+
'with',
|
|
91
|
+
'would',
|
|
92
|
+
]);
|
|
93
|
+
|
|
94
|
+
function addMeaningfulToken(tokens, token) {
|
|
95
|
+
if (token.length < 3) return;
|
|
96
|
+
if (!/[a-z]/u.test(token)) return;
|
|
97
|
+
if (QUERY_RELEVANCE_STOPWORDS.has(token)) return;
|
|
98
|
+
tokens.add(token);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function meaningfulTokensFrom(value) {
|
|
102
|
+
const tokens = new Set();
|
|
103
|
+
if (value === undefined || value === null) return tokens;
|
|
104
|
+
for (const match of String(value).toLowerCase().matchAll(/[a-z0-9]+(?:[-_][a-z0-9]+)*/gu)) {
|
|
105
|
+
const token = match[0];
|
|
106
|
+
addMeaningfulToken(tokens, token);
|
|
107
|
+
if (token.includes('-') || token.includes('_')) {
|
|
108
|
+
for (const part of token.split(/[-_]+/u)) addMeaningfulToken(tokens, part);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return tokens;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function addTokensFromValue(tokens, value) {
|
|
115
|
+
for (const token of meaningfulTokensFrom(value)) tokens.add(token);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function candidateRelevanceTokens(candidate) {
|
|
119
|
+
const tokens = new Set();
|
|
120
|
+
addTokensFromValue(tokens, candidate.content);
|
|
121
|
+
addTokensFromValue(tokens, candidate.metadata?.kind);
|
|
122
|
+
for (const tag of candidate.metadata?.purpose_tags ?? []) addTokensFromValue(tokens, tag);
|
|
123
|
+
return tokens;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function hasTokenOverlap(left, right) {
|
|
127
|
+
for (const token of left) {
|
|
128
|
+
if (right.has(token)) return true;
|
|
129
|
+
}
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function strictQueryRelevance(args) {
|
|
134
|
+
return args.strict_relevance === true
|
|
135
|
+
|| args.strictRelevance === true
|
|
136
|
+
|| args.require_relevance === true
|
|
137
|
+
|| args.requireRelevance === true
|
|
138
|
+
|| args.query_relevance === 'strict'
|
|
139
|
+
|| args.queryRelevance === 'strict';
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
function relevanceCandidateSet(args, candidates) {
|
|
143
|
+
if (args.queryAwareRelevance !== true) return candidates;
|
|
144
|
+
const query = typeof args.query === 'string' ? args.query.trim() : String(args.query ?? '').trim();
|
|
145
|
+
if (query.length === 0) return candidates;
|
|
146
|
+
const queryTokens = meaningfulTokensFrom(query);
|
|
147
|
+
if (queryTokens.size === 0) return candidates;
|
|
148
|
+
|
|
149
|
+
const relevant = [];
|
|
150
|
+
for (const candidate of candidates) {
|
|
151
|
+
if (hasTokenOverlap(queryTokens, candidateRelevanceTokens(candidate))) relevant.push(candidate);
|
|
152
|
+
}
|
|
153
|
+
if (relevant.length > 0) return relevant;
|
|
154
|
+
return strictQueryRelevance(args) ? [] : candidates;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
39
158
|
function normalizedPublicKey(key) {
|
|
40
159
|
return String(key).toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
41
160
|
}
|
|
@@ -215,8 +334,9 @@ function optimizedSelectionFrom(args, candidateAddresses, limit) {
|
|
|
215
334
|
const candidate = optimizationCandidateFrom(args.vault, memoryAddr);
|
|
216
335
|
if (candidate) candidates.push(candidate);
|
|
217
336
|
}
|
|
337
|
+
const planCandidates = relevanceCandidateSet(args, candidates);
|
|
218
338
|
const plan = createMemoryOptimizationPlan({
|
|
219
|
-
candidates,
|
|
339
|
+
candidates: planCandidates,
|
|
220
340
|
prompt: args.query ?? '',
|
|
221
341
|
pricing: contextPackPricing(args),
|
|
222
342
|
now: args.now,
|
|
@@ -237,7 +357,7 @@ function optimizedSelectionFrom(args, candidateAddresses, limit) {
|
|
|
237
357
|
}
|
|
238
358
|
const selectedSet = new Set(selected);
|
|
239
359
|
const selectedPlan = createMemoryOptimizationPlan({
|
|
240
|
-
candidates:
|
|
360
|
+
candidates: planCandidates.filter((candidate) => selectedSet.has(candidate.address)),
|
|
241
361
|
prompt: args.query ?? '',
|
|
242
362
|
pricing: contextPackPricing(args),
|
|
243
363
|
now: args.now,
|
|
@@ -503,11 +623,12 @@ export function compileContextPack(args = {}) {
|
|
|
503
623
|
const tombstones = tombstoneAddressesFrom(vault);
|
|
504
624
|
const limit = Number(args.limit ?? args.max_memories ?? args.maxMemories ?? 12);
|
|
505
625
|
if (!Number.isInteger(limit) || limit < 0) throw new Error('compileContextPack limit must be a non-negative integer');
|
|
506
|
-
const
|
|
626
|
+
const hasExplicitMemoryAddresses = Boolean(requested);
|
|
627
|
+
const candidateAddresses = hasExplicitMemoryAddresses ? [...requested] : [...active];
|
|
507
628
|
let selected = candidateAddresses.slice(0, limit);
|
|
508
629
|
let optimizationPlan = null;
|
|
509
630
|
if (optimizerEnabled(args)) {
|
|
510
|
-
const optimized = optimizedSelectionFrom({ ...args, vault }, candidateAddresses, limit);
|
|
631
|
+
const optimized = optimizedSelectionFrom({ ...args, vault, queryAwareRelevance: !hasExplicitMemoryAddresses }, candidateAddresses, limit);
|
|
511
632
|
selected = optimized.selected;
|
|
512
633
|
optimizationPlan = optimized.plan;
|
|
513
634
|
}
|
|
@@ -6,7 +6,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
6
6
|
|
|
7
7
|
export const INSTALLER_ASSET_SCHEMA = 'enigma.installer_assets.v1';
|
|
8
8
|
export const INSTALLER_ASSET_PACKAGE = 'enigma-memory';
|
|
9
|
-
export const INSTALLER_ASSET_VERSION = '0.1.
|
|
9
|
+
export const INSTALLER_ASSET_VERSION = '0.1.4';
|
|
10
10
|
export const INSTALLER_ASSET_GENERATED_AT = '1970-01-01T00:00:00.000Z';
|
|
11
11
|
|
|
12
12
|
const SCRIPT_PATH = fileURLToPath(import.meta.url);
|
|
@@ -69,6 +69,7 @@ const EXTERNAL_COMPETITOR_ADAPTERS = Object.freeze([
|
|
|
69
69
|
'Operator-supplied benchmark dataset or fixture mapping',
|
|
70
70
|
],
|
|
71
71
|
official_doc: 'https://docs.letta.com/concepts/memgpt/',
|
|
72
|
+
official_positioning: 'Letta/MemGPT provides an agent memory runtime; this harness requires operator-supplied credentials/runtime and pinned SDK artifacts before any comparison.',
|
|
72
73
|
can_run_in_this_harness: false,
|
|
73
74
|
boundary_reason: 'This local harness has no Letta credentials, SDK installation, hosted/self-hosted Letta runtime, fixed agent loop, or approved external dataset, so no Letta score is produced.',
|
|
74
75
|
scores_included: false,
|
|
@@ -84,6 +85,7 @@ const EXTERNAL_COMPETITOR_ADAPTERS = Object.freeze([
|
|
|
84
85
|
'Fixed graph, model, tools, and dataset mapping',
|
|
85
86
|
],
|
|
86
87
|
official_doc: 'https://docs.langchain.com/oss/python/langgraph/memory',
|
|
88
|
+
official_positioning: 'LangGraph memory includes short-term checkpointer memory and a long-term namespaced store; this harness does not execute that runtime.',
|
|
87
89
|
can_run_in_this_harness: false,
|
|
88
90
|
boundary_reason: 'This Node local package harness does not install or execute a LangGraph runtime, checkpointer, namespaced store, graph, model, or dataset adapter, so no LangGraph score is produced.',
|
|
89
91
|
scores_included: false,
|
|
@@ -99,6 +101,7 @@ const EXTERNAL_COMPETITOR_ADAPTERS = Object.freeze([
|
|
|
99
101
|
'Dataset ingestion and retrieval mapping',
|
|
100
102
|
],
|
|
101
103
|
official_doc: 'https://help.getzep.com/',
|
|
104
|
+
official_positioning: 'Zep positions memory around a temporal Context Graph/Context Lake and sub-200ms retrieval; this harness does not verify that retrieval claim.',
|
|
102
105
|
can_run_in_this_harness: false,
|
|
103
106
|
boundary_reason: 'This local harness has no Zep credentials, client package, Context Graph or Context Lake runtime, ingestion job, or provider-approved retrieval dataset, so no Zep score or latency claim is produced.',
|
|
104
107
|
scores_included: false,
|
|
@@ -114,6 +117,7 @@ const EXTERNAL_COMPETITOR_ADAPTERS = Object.freeze([
|
|
|
114
117
|
'Dataset ingestion and scoring mapping',
|
|
115
118
|
],
|
|
116
119
|
official_doc: 'https://docs.mem0.ai/',
|
|
120
|
+
official_positioning: 'Mem0 positions itself as a universal self-improving memory layer with platform and open-source stack options; this harness does not run either stack.',
|
|
117
121
|
can_run_in_this_harness: false,
|
|
118
122
|
boundary_reason: 'This local harness has no Mem0 credentials, SDK/runtime, configured extraction/retrieval loop, model/tool environment, or external dataset adapter, so no Mem0 score is produced.',
|
|
119
123
|
scores_included: false,
|
|
@@ -129,6 +133,7 @@ const EXTERNAL_COMPETITOR_ADAPTERS = Object.freeze([
|
|
|
129
133
|
'Evidence capture that excludes personal data and credentials',
|
|
130
134
|
],
|
|
131
135
|
official_doc: 'https://help.openai.com/en/articles/8590148-memory-faq',
|
|
136
|
+
official_positioning: 'OpenAI ChatGPT native memory is a consumer-app/native capability and is not directly available through this local public-API harness.',
|
|
132
137
|
can_run_in_this_harness: false,
|
|
133
138
|
boundary_reason: 'ChatGPT native memory is a consumer-app feature rather than a public API surface available to this local package harness, so no OpenAI native-memory score is produced.',
|
|
134
139
|
scores_included: false,
|
|
@@ -144,6 +149,7 @@ const EXTERNAL_COMPETITOR_ADAPTERS = Object.freeze([
|
|
|
144
149
|
'Evidence capture that excludes personal data and credentials',
|
|
145
150
|
],
|
|
146
151
|
official_doc: 'https://support.anthropic.com/en/articles/11145838-using-claude-memory',
|
|
152
|
+
official_positioning: 'Claude memory tooling is provider/client-side and requires a Claude runtime plus tool environment outside this local package harness.',
|
|
147
153
|
can_run_in_this_harness: false,
|
|
148
154
|
boundary_reason: 'The Claude memory tool is provider/client-side and requires a Claude runtime plus tool environment that this local package benchmark does not control, so no Claude memory-tool score is produced.',
|
|
149
155
|
scores_included: false,
|
|
@@ -675,6 +681,7 @@ function compareLocalBaselines(vault, passport) {
|
|
|
675
681
|
|
|
676
682
|
rows.push({
|
|
677
683
|
id: baseline.id,
|
|
684
|
+
baseline: baseline.id,
|
|
678
685
|
label: baseline.label,
|
|
679
686
|
boundary: baseline.boundary,
|
|
680
687
|
local_fixture_only: true,
|
|
@@ -684,6 +691,7 @@ function compareLocalBaselines(vault, passport) {
|
|
|
684
691
|
exact_answer_questions: exactTotal,
|
|
685
692
|
exact_answer_correct: exactCorrect,
|
|
686
693
|
exact_answer_recall: exactTotal === 0 ? 0 : Number((exactCorrect / exactTotal).toFixed(6)),
|
|
694
|
+
recall: exactTotal === 0 ? 0 : Number((exactCorrect / exactTotal).toFixed(6)),
|
|
687
695
|
abstention_questions: abstainTotal,
|
|
688
696
|
abstention_correct: abstainCorrect,
|
|
689
697
|
abstention_correctness: abstainTotal === 0 ? 0 : Number((abstainCorrect / abstainTotal).toFixed(6)),
|
|
@@ -740,6 +748,8 @@ function compareProviders(vault, passport, samples) {
|
|
|
740
748
|
provider_runtime_observed: false,
|
|
741
749
|
external_provider_called: false,
|
|
742
750
|
same_enigma_context_pack_boundary: true,
|
|
751
|
+
scores_included: false,
|
|
752
|
+
not_external_competitor_score: true,
|
|
743
753
|
boundary: {
|
|
744
754
|
optimize: CONTEXT_BOUNDARY.optimize,
|
|
745
755
|
max_estimated_tokens: CONTEXT_BOUNDARY.max_estimated_tokens,
|
|
@@ -863,6 +873,7 @@ export function runMemoryBenchmarkSuite(options = {}) {
|
|
|
863
873
|
context_pack_verify_valid: contextVerification.valid === true,
|
|
864
874
|
},
|
|
865
875
|
},
|
|
876
|
+
local_baseline_comparisons: localBaselineRows,
|
|
866
877
|
cross_provider_profiles: providerRows,
|
|
867
878
|
external_competitor_adapters: EXTERNAL_COMPETITOR_ADAPTERS,
|
|
868
879
|
public_claims_allowed: PUBLIC_CLAIMS_ALLOWED,
|