Understanding results¶
Every heams run receives one exact run directory through --output-dir. One
invocation can contain many experiments; each experiment gets its own stable
directory below the run directory. Repeating the same command resumes from the
saved snapshots and runs.jsonl ledgers instead of creating a new run.
--overwrite is guarded: it clears only a directory whose HEAMS snapshots and
ledgers validate successfully; malformed or unrelated directories are left
untouched.
Run-level artefacts¶
At output_dir/:
| File / directory | Contents |
|---|---|
run_config.<run_id>.yaml |
Snapshot of the resolved run (experiments + paths) |
<experiment_name>/ |
One stable directory per experiment |
submetrics.csv |
Written by heams generate-report --detailed: one row per tagged sub-metric score and efficiency metric, per sample |
_rollup/<type>/report.md |
Only if you generate the optional per-benchmark rollups (see below) |
run_id is generated at resolve time (YYYYMMDD-HHMMSS-<8 hex chars>).
Per-experiment artefacts¶
Inside <experiment_name>/:
| File / directory | Contents |
|---|---|
experiment_config.<run_id>.yaml |
Fully resolved agent, memory, and benchmark configs |
runs.jsonl |
One RunResult JSON object per completed scenario/sample combination (appended during the run) |
execution_traces.jsonl |
One ordered framework + agent execution trace per RunResult |
run_status.json |
Boolean success, runnable/skipped counts, optional error |
report.md |
Written by heams generate-report: metrics, a summary, and detail for up to --max-examples samples (10 by default) |
workspace/ |
Scenario-scoped memory files and local vector-store directories |
RunResult.trace_id joins a sample to exactly one row in
execution_traces.jsonl, including after a resumed attempt. Each trace records
priming, scenario manipulations, memory operations, user stimuli, LLM calls,
and tool calls in timestamp order. Events expose structured arguments/results
and a display-ready content field. Failed agent calls retain partial
TinyAgent spans when the framework provides them. Priming wrappers store an
entry count only; per-entry retain/recall payloads remain on
memory_operation events (and on RunResult.memory_ledger).
Execution traces contain model-visible prompts, recalled memory, and tool
output. Treat them as private run artifacts; they may contain sensitive user
data. Size is typically on the order of runs.jsonl rather than a second copy
of the full priming corpus.
heams generate-report joins traces by trace_id when the sidecar is present
and adds a compact ordered sequence plus event/tool counts to each selected
sample detail. Reports generated from older directories without traces remain
unchanged.
The orchestrator derives storage paths per scenario and sample:
- All backends:
workspace/<scenario>-a0-m0-e0-s<sample>-memory/
The current experiment path binds one agent, one memory system, and each
sample's evaluator, so the runtime combination key is a0-m0-e0. Persistent
backends own their layout within that directory; in-process/no-op backends leave
it empty until teardown removes it.
heams run writes no Markdown reports. Run heams generate-report --results-dir
<output_dir> afterwards to write a report.md in each experiment directory.
Per-benchmark rollups (optional, Python only)¶
A rollup compares memory systems on one benchmark across all the experiments in
a run directory. No heams command writes rollups; generate them from saved
artifacts with write_benchmark_rollup_reports(results_dir):
cd python_package
uv run python -c "from pathlib import Path; from heams.reporting.benchmark_rollup import write_benchmark_rollup_reports; print(write_benchmark_rollup_reports(Path('results/locomo_smoke')))"
The function:
- Finds experiment directories that contain
runs.jsonland anexperiment_config.*.yaml - Groups them by
benchmark_config.type - Remaps memory labels from each experiment's resolved memory-system config
- Writes
_rollup/<type>/report.mdfor registered types (locomo,transparency,stale,ee,ci,mpbench,beam,retention_policy)
Contextual Integrity rollup¶
The CI rollup is generated from saved artifacts by
write_ci_rollup_report(results_dir) (or as part of
write_benchmark_rollup_reports; no heams command writes it), which:
- Finds experiment directories that contain
runs.jsonland a CIbenchmark_config - Reads the memory label from each experiment's resolved memory-system config
- Writes
_rollup/ci/report.mdwith the leakage, coverage, and helpfulness table, one row per memory backend
To read it, open _rollup/ci/report.md and compare memory backends across the
leakage family (lower is better) and the coverage family (higher is better). What
each column means is defined in the
Contextual Integrity evaluation section.
Use each experiment's runs.jsonl for machine-readable follow-up.
Browsing results¶
heams browse --results-dir <dir> opens a local web GUI over these artefacts:
a criterion table across memory systems (one run per benchmark, the
largest or the latest finished, computed from runs.jsonl), each experiment's samples,
and each sample's transcript, judge records, metrics and memory ledger. See
Results browser.
Reading accuracy¶
For any benchmark:
- Run
heams generate-report --results-dir <output_dir>and open each experiment'sreport.md - Compare memory systems by comparing their experiments' reports, or generate the per-benchmark rollups above for one table per benchmark
- Drill into the detail sections for failed keys and transcripts
- Use each experiment's
runs.jsonlfor machine-readable follow-up
For LongMemEval:
- Run
make run CONFIG=testing/long_mem_eval_smoke OUTPUT_DIR=results/long_mem_eval_smoke, or execute thelong_mem_eval.yamlentry from a per-memory full campaign matrix. - Run
heams generate-reporton the output directory and open each experiment'sreport.md, or read itsruns.jsonl. report.mdhas a sub-metric table per tag, including question type and abstention. LongMemEval has no per-benchmark rollup.
Higher accuracy is better for task correctness. Component-level metric tables are emitted only when the artifact-backed report renderer supports them.