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.
@@ -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.3`. The local benchmark is available through the package script and the script file it wraps:
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.3`.
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 and optimizer boundary. |
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.3` package, runs:
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 and optimizer boundary. | Same fields plus duplicate-removal counts from the Enigma optimizer plan. |
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 claims stay blocked until the required credentials, runtimes, and datasets are supplied and reviewed.
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. It is 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.
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`. 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.
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "enigma-memory",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "type": "module",
5
5
  "description": "Provider-agnostic AI memory passport and offline-verifiable proof layer.",
6
6
  "license": "Apache-2.0",
@@ -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.3' });
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: candidates.filter((candidate) => selectedSet.has(candidate.address)),
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 candidateAddresses = requested ? [...requested] : [...active];
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.3';
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,