MELT — Memory Evaluation for Lifecycle Testing. A benchmark for agentic memory system lifecycle mechanics.
Python
4
179 commits
updated Jul 15, 2026
MELT is an open benchmark runner for evaluating long-lived memory in AI agent systems. It tests whether a memory system remains useful and correct as facts change, old information expires, new evidence arrives, and the system performs maintenance over time.
Most memory benchmarks evaluate retrieval from a fixed transcript or preloaded conversation history. MELT is built for the harder lifecycle questions: did the system store the right thing, update it when the world changed, keep durable facts through consolidation, avoid overclaiming, and retrieve the right evidence at the right time?
MELT is two things at once: a harness for running memory evaluations under a reproducible report envelope, and a native lifecycle benchmark that probes those harder questions directly. The same harness also runs adapted versions of LongMemEval, LoCoMo, and RHELM, so you can compare a system on established retrieval benchmarks and on MELT's lifecycle tasks side by side.
MELT is not tied to one memory implementation. Any system can be evaluated by implementing the System Under Test (SUT) adapter contract.
| Dimension | Question MELT asks |
|---|---|
| Write quality | Did the system capture useful information from the session? |
| Correction | Did newer facts replace superseded older facts? |
| Contradiction | Did conflicting claims remain distinguishable instead of being merged into a false fact? |
| Temporal recall | Can the system answer as-of a point in time and keep historical facts available after they change? |
| Project scope | Do similar parallel projects remain isolated, with only explicit sharing crossing boundaries? |
| Conflict precision | Does the system preserve true same-scope conflicts without treating contextual differences as contradictions? |
| Provenance | Are evidence identity, source scope, and answer citations retained through lifecycle operations? |
| Maintenance | Did consolidation and decay preserve useful memories while letting stale ones expire? |
| Core memory | Did durable preferences and identity facts survive over time? |
| Multi-hop recall | Can the system retrieve related evidence from separate sessions? |
| Abstention | Does the system decline when it should not know the answer? |
| Methodology | Are splits, seeds, top-k settings, baselines, judge settings, and provenance recorded? |
melt runlifecycle-v4 plus
lifecycle-v5, whose separate core, scoped, answer, and agentic score profiles
cover parallel-project isolation, selective sharing, correction versus
contradiction, bitemporal recall, provenance, revocation, and structured answersmelt download-rhelm)fake SUT, the shisad subprocess SUT, and the
memobase HTTP servicepreliminary/diagnostic/final/not_supported/invalid
result statusLifecycle v5 currently uses lifecycle-score/2.1.0 and RFC 8785 comparison-key
version 2. Reports produced with the original 2.0.0 scorer/key-v1 remain
readable, but they are not exact comparisons to corrected 2.1.0 results.
MELT is an early release. The runner and current suites are usable; larger native corpora and additional adapters are expected to grow over time. Reference runs across SUTs are published in RESULTS.md.
git clone https://github.com/shisa-ai/MELT.git
cd MELT
uv sync
# Run the minimal smoke fixture against the deterministic fake SUT.
uv run melt run --sut fake --suite smoke --fixture smoke --output-dir results
# Run the historical B2 lifecycle-v4 smoke suite (the compatibility default).
uv run melt run --sut fake --suite lifecycle --fixture smoke --top-k 3 --output-dir results
# Run Lifecycle v5's B3 parallel-project scoped profile.
uv run melt run --sut fake --suite lifecycle --suite-version lifecycle-v5 \
--fixture mini --score-profile lifecycle-v5-scoped --top-k 12 \
--sut-contract-version b3 --output-dir results
# Run deterministic SUT-native structured answers on the v5 answer profile.
uv run melt run --sut fake --suite lifecycle --suite-version lifecycle-v5 \
--fixture mini --score-profile lifecycle-v5-answer --top-k 12 \
--answer-mode sut_native --sut-contract-version b3 --output-dir results
# Exercise harness-generated answers and deterministic judged QA.
uv run melt run --sut fake --suite smoke --fixture smoke --answer-mode harness --judge --output-dir results
# Add answer-control baselines for leakage and upper-bound checks.
uv run melt run --sut fake --suite smoke --fixture smoke --answer-mode harness --judge \
--baseline --no-context-baseline --gold-evidence-baseline --full-transcript-baseline \
--output-dir results
# Resume a long run from completed per-case checkpoints.
uv run melt run --sut fake --suite smoke --fixture smoke --answer-mode harness --judge \
--resume-from-checkpoint-dir results/checkpoints/<invocation-id> \
--output-dir results
# Download RHELM without installing Hugging Face datasets or hub packages.
uv run melt download-rhelm --output-dir data/rhelm
# Run the test suite.
uv run pytest
Each benchmark run writes a JSON report under the configured output directory. The report records the immutable suite and canonical fixture hash separately from the materialized run hash, plus SUT identity, contract version, profile and score-protocol manifests, protocol hash, per-metric comparison keys, fixed seed schedule, uncertainty, validity guards, warnings, and result status. Answer-generation runs also record structured answer modes, citations, claim scopes, prompt hashes, judge identity, and compact usage metadata. Only identical comparison keys are exact leaderboard comparisons.
Long answer runs write per-case checkpoints under
<output-dir>/checkpoints/<invocation-id>/<run-id>/. --resume-from-checkpoint-dir
can point at either that run-specific directory or its invocation parent; MELT
reuses completed cases and continues with the remaining ones.
Harness-answer runs can use deterministic local scoring or an OpenAI-compatible HTTP provider configured in TOML:
[answer]
mode = "harness"
[answer.model]
provider = "openai_compatible"
model = "answer-model"
base_url = "${ANSWER_MODEL_BASE_URL}"
api_key = "${ANSWER_MODEL_API_KEY}"
max_output_tokens = 4096
[judge]
enabled = true
mode = "llm"
[judge.model]
provider = "openai_compatible"
model = "judge-model"
base_url = "${JUDGE_MODEL_BASE_URL}"
api_key = "${JUDGE_MODEL_API_KEY}"
max_output_tokens = 4096
Official-like profile shortcuts pin prompt IDs and record deviations in the report envelope:
uv run melt run --suite locomo --fixture smoke --answer-profile locomo_official_like --judge
Compare two report-schema-v5 scores without conflating protocols:
uv run melt compare path/to/left-summary.json path/to/right-summary.json \
--metric scope_evidence_leak_rate
The command returns exact, qualified, or not_comparable from the frozen
score identities rather than comparing metric names alone.
| Suite | Fixtures | Purpose |
|---|---|---|
smoke | smoke | Minimal end-to-end check for runner, SUT contract, scoring, and report generation. |
lifecycle | smoke, mini, full, stress | Versioned native benchmark: frozen B2-compatible lifecycle-v4, and B3 lifecycle-v5 profiles for core regression, project scoping/conflict, structured answers, and agentic policy. Select v5 with --suite-version lifecycle-v5. |
longmemeval | smoke, external, full | LongMemEval records normalized into MELT's report envelope. |
locomo | smoke, external, full | LoCoMo records normalized into MELT's report envelope, including Category 5 audit metadata. |
rhelm | smoke, external, full | RHELM records normalized into scenario-level cases with document, section, turn, question-type, and source-type reporting. |
Full LongMemEval and LoCoMo runs require locally supplied dataset files. RHELM can be downloaded with MELT's dependency-free downloader:
uv run melt download-rhelm --output-dir data/rhelm
uv run melt run --sut fake --suite rhelm --fixture external --dataset-path data/rhelm --output-dir results
MELT does not vendor restricted external datasets. LoCoMo external/full fixtures
use conversation-level cases by default, so each conversation is ingested once
and all of its questions are asked against that state. Use
--case-granularity qa only when you explicitly need the legacy one-question-
per-case shape.
Retrieval-only MELT runs do not call an answer model or LLM judge. API cost is only incurred when you enable a model-backed answer path, a model-backed judge, or answer baselines. Every report records answer/judge calls, tokens, cache usage, elapsed time, and max RSS so you can price a run against your provider's current rates.
Typical suite sizes:
| Suite / fixture | Local snapshot size | Cases / questions | Retrieval queries | Model calls when answer + judge are enabled |
|---|---|---|---|---|
smoke / smoke | built in | 1 case, 1 QA expectation | 1 | 1 answer + 1 judge |
lifecycle-v4 / smoke | frozen built in | 7 cases | 7 | 0; v4 has no QA expectations |
lifecycle-v4 / mini | frozen built in | 48 cases | 48 | 0; v4 has no QA expectations |
lifecycle-v4 / full | frozen built in | 217 cases | 217 | 0; v4 has no QA expectations |
lifecycle-v4 / stress | frozen built in | 373 cases | 373 | 0; v4 has no QA expectations |
lifecycle-v5-scoped / smoke | frozen built in | 6 cases | 14 | 0; QA expectations are inactive in this profile |
lifecycle-v5-scoped / mini | frozen built in | 18 cases | 44 | 0; designed for CI and adapter conformance |
lifecycle-v5-scoped / full | frozen built in | 72 cases | 176 | 0; four variants per scenario cluster |
lifecycle-v5-scoped / stress | frozen built in | 144 cases | 352 | 0; eight variants per scenario cluster |
lifecycle-v5-answer / mini | frozen built in | 9 cases, 18 QA expectations | 25 | 18 answers + up to 18 judges |
lifecycle-v5-answer / full | frozen built in | 36 cases, 72 QA expectations | 100 | 72 answers + up to 72 judges |
longmemeval / smoke | built in | 2 cases, 1 QA expectation | 2 | 1 answer + 1 judge |
longmemeval / full variant S | user supplied; 265 MB in the local reference snapshot | 500 questions | 500 | up to 500 answers + 500 judges |
longmemeval / full variant M | user supplied; 2.6 GB in the local reference snapshot | 500 questions | 500 | up to 500 answers + 500 judges |
locomo / smoke | built in | 1 case, 1 QA expectation | 1 | 1 answer + 1 judge |
locomo / full, Category 5 excluded | user supplied; 2.7 MB in the local reference snapshot | 10 conversation cases, 1540 questions | 1540 | up to 1540 answers + 1540 judges |
locomo / full, Category 5 included | user supplied; 2.7 MB in the local reference snapshot | 10 conversation cases, 1986 questions | 1986 | up to 1986 answers + 1986 judges |
rhelm / smoke | built in | 1 scenario, 2 QA expectations | 2 | 2 answers + 2 judges |
rhelm / full | user supplied; 53 MB in the local reference snapshot | 10 scenarios, 1305 questions | 1305 | up to 1305 answers + 1305 judges |
Lifecycle v5 freezes top-k 12 and the five-seed schedule 1103, 2207, 3301, 4409, 5501 for final profiles. Multiply the one-run counts above by five for a
final held-out score. The fake reference runs complete scoped mini well below
the two-minute CI budget; service adapters remain provider-dependent. The
scoped/core/agentic profiles make no MELT answer or judge calls. The answer
profile makes one answer operation per active QA expectation, plus one judge
call only when judging is enabled.
Baselines multiply answer calls. For example, running SUT answers plus
--no-context-baseline, --gold-evidence-baseline, and
--full-transcript-baseline can add three extra answer calls per question before
judging. Context size also depends on the SUT: a system that returns longer
retrieval snippets can cost more to answer and judge than one with the same
question count.
As a concrete reference, the published LoCoMo Category 5 included runs in
RESULTS.md used 1986 answer calls and 1986 judge calls per SUT
with a GPT-5.4 Mini answer model and GPT-5.4 judge. At the prices recorded in
that results section, equivalent cost was $4.46 for shisad and $8.92 for
Memobase because the returned contexts differed. The published lifecycle full
runs used zero MELT answer/judge calls and took about 95 seconds for shisad and
379 seconds for the successful Memobase run on the local reference machine.
melt run -> Config -> Runner -> SUT Adapter -> System Under Test
|
v
Suite / Fixture
|
v
Scoring + Methodology
|
v
JSON Report
To evaluate a memory system with MELT, implement a SUT adapter. The adapter can wrap an in-process library, a subprocess, or a service, but it must expose the versioned SUT operations expected by the runner:
hello / hello_ackmetadataresetingestmemory_writeconsolidate, manage, and tickmemory_export, memory_delete, and memory_revokequeryanswershutdownB3 is a strict B2 superset. Its scoped_memory capability carries canonical
scope and visibility objects through writes, maintenance, export, retrieval,
and acknowledgements; session_id remains grouping metadata, not an isolation
boundary. Adapters without scoped retrieval produce not_supported for scoped
profiles rather than appearing to pass by dropping fields.
The adapter guide describes the JSONL-over-stdio protocol, capability negotiation, message shapes, and expected error behavior: docs/adapters.md.
MELT reports are designed to make evaluation claims easier to audit:
preliminary. Lifecycle v5 profile
diagnostics are diagnostic; only the frozen held-out five-seed/top-k
protocol can become final.uv sync
uv run pytest
uv run melt --help
uv run melt run --help
Project structure:
src/melt/ Runner, scoring, config, reports, adapters, and SUT APIs
src/melt/suites/ MELT-native lifecycle suites
src/melt/adapters/ Standard benchmark import adapters
src/melt/sut/ SUT adapter interfaces and registry
docs/adapters.md SUT adapter authoring guide
docs/PLAN-lifecycle.md MELT-native lifecycle benchmark design
docs/PLAN-answer.md Answer-generation and judged-QA design plan
docs/INITIAL.md Original benchmark design draft
RESULTS.md Published reference runs and methodology notes
tests/ Unit and behavioral tests
MELT was developed during the course of ShisaD's memory system development when we discovered there was no memory eval that properly tested how memory systems work over time.
Copyright 2026 Shisa AI
Licensed under the Apache License, Version 2.0. See LICENSE for details.
179 commits
Python
100.0%
MELT — Memory Evaluation for Lifecycle Testing. A benchmark for agentic memory system lifecycle mechanics.
Python
4
179 commits
updated Jul 15, 2026
MELT is an open benchmark runner for evaluating long-lived memory in AI agent systems. It tests whether a memory system remains useful and correct as facts change, old information expires, new evidence arrives, and the system performs maintenance over time.
Most memory benchmarks evaluate retrieval from a fixed transcript or preloaded conversation history. MELT is built for the harder lifecycle questions: did the system store the right thing, update it when the world changed, keep durable facts through consolidation, avoid overclaiming, and retrieve the right evidence at the right time?
MELT is two things at once: a harness for running memory evaluations under a reproducible report envelope, and a native lifecycle benchmark that probes those harder questions directly. The same harness also runs adapted versions of LongMemEval, LoCoMo, and RHELM, so you can compare a system on established retrieval benchmarks and on MELT's lifecycle tasks side by side.
MELT is not tied to one memory implementation. Any system can be evaluated by implementing the System Under Test (SUT) adapter contract.
| Dimension | Question MELT asks |
|---|---|
| Write quality | Did the system capture useful information from the session? |
| Correction | Did newer facts replace superseded older facts? |
| Contradiction | Did conflicting claims remain distinguishable instead of being merged into a false fact? |
| Temporal recall | Can the system answer as-of a point in time and keep historical facts available after they change? |
| Project scope | Do similar parallel projects remain isolated, with only explicit sharing crossing boundaries? |
| Conflict precision | Does the system preserve true same-scope conflicts without treating contextual differences as contradictions? |
| Provenance | Are evidence identity, source scope, and answer citations retained through lifecycle operations? |
| Maintenance | Did consolidation and decay preserve useful memories while letting stale ones expire? |
| Core memory | Did durable preferences and identity facts survive over time? |
| Multi-hop recall | Can the system retrieve related evidence from separate sessions? |
| Abstention | Does the system decline when it should not know the answer? |
| Methodology | Are splits, seeds, top-k settings, baselines, judge settings, and provenance recorded? |
melt runlifecycle-v4 plus
lifecycle-v5, whose separate core, scoped, answer, and agentic score profiles
cover parallel-project isolation, selective sharing, correction versus
contradiction, bitemporal recall, provenance, revocation, and structured answersmelt download-rhelm)fake SUT, the shisad subprocess SUT, and the
memobase HTTP servicepreliminary/diagnostic/final/not_supported/invalid
result statusLifecycle v5 currently uses lifecycle-score/2.1.0 and RFC 8785 comparison-key
version 2. Reports produced with the original 2.0.0 scorer/key-v1 remain
readable, but they are not exact comparisons to corrected 2.1.0 results.
MELT is an early release. The runner and current suites are usable; larger native corpora and additional adapters are expected to grow over time. Reference runs across SUTs are published in RESULTS.md.
git clone https://github.com/shisa-ai/MELT.git
cd MELT
uv sync
# Run the minimal smoke fixture against the deterministic fake SUT.
uv run melt run --sut fake --suite smoke --fixture smoke --output-dir results
# Run the historical B2 lifecycle-v4 smoke suite (the compatibility default).
uv run melt run --sut fake --suite lifecycle --fixture smoke --top-k 3 --output-dir results
# Run Lifecycle v5's B3 parallel-project scoped profile.
uv run melt run --sut fake --suite lifecycle --suite-version lifecycle-v5 \
--fixture mini --score-profile lifecycle-v5-scoped --top-k 12 \
--sut-contract-version b3 --output-dir results
# Run deterministic SUT-native structured answers on the v5 answer profile.
uv run melt run --sut fake --suite lifecycle --suite-version lifecycle-v5 \
--fixture mini --score-profile lifecycle-v5-answer --top-k 12 \
--answer-mode sut_native --sut-contract-version b3 --output-dir results
# Exercise harness-generated answers and deterministic judged QA.
uv run melt run --sut fake --suite smoke --fixture smoke --answer-mode harness --judge --output-dir results
# Add answer-control baselines for leakage and upper-bound checks.
uv run melt run --sut fake --suite smoke --fixture smoke --answer-mode harness --judge \
--baseline --no-context-baseline --gold-evidence-baseline --full-transcript-baseline \
--output-dir results
# Resume a long run from completed per-case checkpoints.
uv run melt run --sut fake --suite smoke --fixture smoke --answer-mode harness --judge \
--resume-from-checkpoint-dir results/checkpoints/<invocation-id> \
--output-dir results
# Download RHELM without installing Hugging Face datasets or hub packages.
uv run melt download-rhelm --output-dir data/rhelm
# Run the test suite.
uv run pytest
Each benchmark run writes a JSON report under the configured output directory. The report records the immutable suite and canonical fixture hash separately from the materialized run hash, plus SUT identity, contract version, profile and score-protocol manifests, protocol hash, per-metric comparison keys, fixed seed schedule, uncertainty, validity guards, warnings, and result status. Answer-generation runs also record structured answer modes, citations, claim scopes, prompt hashes, judge identity, and compact usage metadata. Only identical comparison keys are exact leaderboard comparisons.
Long answer runs write per-case checkpoints under
<output-dir>/checkpoints/<invocation-id>/<run-id>/. --resume-from-checkpoint-dir
can point at either that run-specific directory or its invocation parent; MELT
reuses completed cases and continues with the remaining ones.
Harness-answer runs can use deterministic local scoring or an OpenAI-compatible HTTP provider configured in TOML:
[answer]
mode = "harness"
[answer.model]
provider = "openai_compatible"
model = "answer-model"
base_url = "${ANSWER_MODEL_BASE_URL}"
api_key = "${ANSWER_MODEL_API_KEY}"
max_output_tokens = 4096
[judge]
enabled = true
mode = "llm"
[judge.model]
provider = "openai_compatible"
model = "judge-model"
base_url = "${JUDGE_MODEL_BASE_URL}"
api_key = "${JUDGE_MODEL_API_KEY}"
max_output_tokens = 4096
Official-like profile shortcuts pin prompt IDs and record deviations in the report envelope:
uv run melt run --suite locomo --fixture smoke --answer-profile locomo_official_like --judge
Compare two report-schema-v5 scores without conflating protocols:
uv run melt compare path/to/left-summary.json path/to/right-summary.json \
--metric scope_evidence_leak_rate
The command returns exact, qualified, or not_comparable from the frozen
score identities rather than comparing metric names alone.
| Suite | Fixtures | Purpose |
|---|---|---|
smoke | smoke | Minimal end-to-end check for runner, SUT contract, scoring, and report generation. |
lifecycle | smoke, mini, full, stress | Versioned native benchmark: frozen B2-compatible lifecycle-v4, and B3 lifecycle-v5 profiles for core regression, project scoping/conflict, structured answers, and agentic policy. Select v5 with --suite-version lifecycle-v5. |
longmemeval | smoke, external, full | LongMemEval records normalized into MELT's report envelope. |
locomo | smoke, external, full | LoCoMo records normalized into MELT's report envelope, including Category 5 audit metadata. |
rhelm | smoke, external, full | RHELM records normalized into scenario-level cases with document, section, turn, question-type, and source-type reporting. |
Full LongMemEval and LoCoMo runs require locally supplied dataset files. RHELM can be downloaded with MELT's dependency-free downloader:
uv run melt download-rhelm --output-dir data/rhelm
uv run melt run --sut fake --suite rhelm --fixture external --dataset-path data/rhelm --output-dir results
MELT does not vendor restricted external datasets. LoCoMo external/full fixtures
use conversation-level cases by default, so each conversation is ingested once
and all of its questions are asked against that state. Use
--case-granularity qa only when you explicitly need the legacy one-question-
per-case shape.
Retrieval-only MELT runs do not call an answer model or LLM judge. API cost is only incurred when you enable a model-backed answer path, a model-backed judge, or answer baselines. Every report records answer/judge calls, tokens, cache usage, elapsed time, and max RSS so you can price a run against your provider's current rates.
Typical suite sizes:
| Suite / fixture | Local snapshot size | Cases / questions | Retrieval queries | Model calls when answer + judge are enabled |
|---|---|---|---|---|
smoke / smoke | built in | 1 case, 1 QA expectation | 1 | 1 answer + 1 judge |
lifecycle-v4 / smoke | frozen built in | 7 cases | 7 | 0; v4 has no QA expectations |
lifecycle-v4 / mini | frozen built in | 48 cases | 48 | 0; v4 has no QA expectations |
lifecycle-v4 / full | frozen built in | 217 cases | 217 | 0; v4 has no QA expectations |
lifecycle-v4 / stress | frozen built in | 373 cases | 373 | 0; v4 has no QA expectations |
lifecycle-v5-scoped / smoke | frozen built in | 6 cases | 14 | 0; QA expectations are inactive in this profile |
lifecycle-v5-scoped / mini | frozen built in | 18 cases | 44 | 0; designed for CI and adapter conformance |
lifecycle-v5-scoped / full | frozen built in | 72 cases | 176 | 0; four variants per scenario cluster |
lifecycle-v5-scoped / stress | frozen built in | 144 cases | 352 | 0; eight variants per scenario cluster |
lifecycle-v5-answer / mini | frozen built in | 9 cases, 18 QA expectations | 25 | 18 answers + up to 18 judges |
lifecycle-v5-answer / full | frozen built in | 36 cases, 72 QA expectations | 100 | 72 answers + up to 72 judges |
longmemeval / smoke | built in | 2 cases, 1 QA expectation | 2 | 1 answer + 1 judge |
longmemeval / full variant S | user supplied; 265 MB in the local reference snapshot | 500 questions | 500 | up to 500 answers + 500 judges |
longmemeval / full variant M | user supplied; 2.6 GB in the local reference snapshot | 500 questions | 500 | up to 500 answers + 500 judges |
locomo / smoke | built in | 1 case, 1 QA expectation | 1 | 1 answer + 1 judge |
locomo / full, Category 5 excluded | user supplied; 2.7 MB in the local reference snapshot | 10 conversation cases, 1540 questions | 1540 | up to 1540 answers + 1540 judges |
locomo / full, Category 5 included | user supplied; 2.7 MB in the local reference snapshot | 10 conversation cases, 1986 questions | 1986 | up to 1986 answers + 1986 judges |
rhelm / smoke | built in | 1 scenario, 2 QA expectations | 2 | 2 answers + 2 judges |
rhelm / full | user supplied; 53 MB in the local reference snapshot | 10 scenarios, 1305 questions | 1305 | up to 1305 answers + 1305 judges |
Lifecycle v5 freezes top-k 12 and the five-seed schedule 1103, 2207, 3301, 4409, 5501 for final profiles. Multiply the one-run counts above by five for a
final held-out score. The fake reference runs complete scoped mini well below
the two-minute CI budget; service adapters remain provider-dependent. The
scoped/core/agentic profiles make no MELT answer or judge calls. The answer
profile makes one answer operation per active QA expectation, plus one judge
call only when judging is enabled.
Baselines multiply answer calls. For example, running SUT answers plus
--no-context-baseline, --gold-evidence-baseline, and
--full-transcript-baseline can add three extra answer calls per question before
judging. Context size also depends on the SUT: a system that returns longer
retrieval snippets can cost more to answer and judge than one with the same
question count.
As a concrete reference, the published LoCoMo Category 5 included runs in
RESULTS.md used 1986 answer calls and 1986 judge calls per SUT
with a GPT-5.4 Mini answer model and GPT-5.4 judge. At the prices recorded in
that results section, equivalent cost was $4.46 for shisad and $8.92 for
Memobase because the returned contexts differed. The published lifecycle full
runs used zero MELT answer/judge calls and took about 95 seconds for shisad and
379 seconds for the successful Memobase run on the local reference machine.
melt run -> Config -> Runner -> SUT Adapter -> System Under Test
|
v
Suite / Fixture
|
v
Scoring + Methodology
|
v
JSON Report
To evaluate a memory system with MELT, implement a SUT adapter. The adapter can wrap an in-process library, a subprocess, or a service, but it must expose the versioned SUT operations expected by the runner:
hello / hello_ackmetadataresetingestmemory_writeconsolidate, manage, and tickmemory_export, memory_delete, and memory_revokequeryanswershutdownB3 is a strict B2 superset. Its scoped_memory capability carries canonical
scope and visibility objects through writes, maintenance, export, retrieval,
and acknowledgements; session_id remains grouping metadata, not an isolation
boundary. Adapters without scoped retrieval produce not_supported for scoped
profiles rather than appearing to pass by dropping fields.
The adapter guide describes the JSONL-over-stdio protocol, capability negotiation, message shapes, and expected error behavior: docs/adapters.md.
MELT reports are designed to make evaluation claims easier to audit:
preliminary. Lifecycle v5 profile
diagnostics are diagnostic; only the frozen held-out five-seed/top-k
protocol can become final.uv sync
uv run pytest
uv run melt --help
uv run melt run --help
Project structure:
src/melt/ Runner, scoring, config, reports, adapters, and SUT APIs
src/melt/suites/ MELT-native lifecycle suites
src/melt/adapters/ Standard benchmark import adapters
src/melt/sut/ SUT adapter interfaces and registry
docs/adapters.md SUT adapter authoring guide
docs/PLAN-lifecycle.md MELT-native lifecycle benchmark design
docs/PLAN-answer.md Answer-generation and judged-QA design plan
docs/INITIAL.md Original benchmark design draft
RESULTS.md Published reference runs and methodology notes
tests/ Unit and behavioral tests
MELT was developed during the course of ShisaD's memory system development when we discovered there was no memory eval that properly tested how memory systems work over time.
Copyright 2026 Shisa AI
Licensed under the Apache License, Version 2.0. See LICENSE for details.
179 commits
Python
100.0%