<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Preeti Soni</title>
    <description>The latest articles on DEV Community by Preeti Soni (@preeti_2528).</description>
    <link>https://dev.to/preeti_2528</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4045957%2F5f95cd35-d1e3-4d7f-95b3-cffc5af4055f.png</url>
      <title>DEV Community: Preeti Soni</title>
      <link>https://dev.to/preeti_2528</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/preeti_2528"/>
    <language>en</language>
    <item>
      <title>What "temporal reasoning" actually means in LongMemEval</title>
      <dc:creator>Preeti Soni</dc:creator>
      <pubDate>Sat, 25 Jul 2026 16:58:27 +0000</pubDate>
      <link>https://dev.to/preeti_2528/what-temporal-reasoning-actually-means-in-longmemeval-1llh</link>
      <guid>https://dev.to/preeti_2528/what-temporal-reasoning-actually-means-in-longmemeval-1llh</guid>
      <description>&lt;p&gt;Every AI memory provider quotes their LongMemEval temporal-reasoning score.&lt;br&gt;
The leaders sit around 90%. I spent an afternoon reading the actual dataset&lt;br&gt;
instead of running it, and found that "temporal reasoning" is really at least&lt;br&gt;
three different capabilities stapled together under one accuracy number.&lt;/p&gt;

&lt;p&gt;Here's what's actually in there with the JSON and terminal output to back&lt;br&gt;
it up.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I did, and didn't do
&lt;/h2&gt;

&lt;p&gt;I did not run the benchmark. This is an analysis of the dataset itself:&lt;br&gt;
question types, answer formats, and how the traps are constructed.&lt;/p&gt;

&lt;p&gt;That's a real limitation and I want it stated up front. I can tell you what&lt;br&gt;
LongMemEval &lt;em&gt;tests&lt;/em&gt;. I can't tell you which questions any particular provider&lt;br&gt;
fails on, because I didn't run it.&lt;/p&gt;

&lt;p&gt;Everything below comes from the 500 question files that ship with the dataset,&lt;br&gt;
readable with MemoryBench's &lt;code&gt;list-questions&lt;/code&gt; command and a text editor. No API&lt;br&gt;
keys, no cost.&lt;/p&gt;


&lt;h2&gt;
  
  
  42% of the benchmark is time-dependent
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Total questions:      500
temporal-reasoning:   133  (27%)
knowledge-update:      78  (16%)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Two categories, both about how facts change over time. Together they're a little&lt;br&gt;
over two-fifths of the whole benchmark.&lt;/p&gt;

&lt;p&gt;That's a lot of weight on one capability. It also means a provider's headline&lt;br&gt;
number is heavily influenced by how it handles time which makes it worth&lt;br&gt;
knowing what "handling time" actually requires here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5hfgx99w22zbky7rlswb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5hfgx99w22zbky7rlswb.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Trap one: state-change pairs
&lt;/h2&gt;

&lt;p&gt;Some questions come in pairs that share a scenario and ask about different&lt;br&gt;
moments in it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;07741c44   "Where do I initially keep my old sneakers?"
           answer: under my bed

07741c45   "Where do I currently keep my old sneakers?"
           answer: in a shoe rack in my closet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same object. Same conversation history. Both questions point at the same two&lt;br&gt;
answer sessions. The only difference is &lt;em&gt;initially&lt;/em&gt; versus &lt;em&gt;currently&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Farf1doo6rqf07aauatqv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Farf1doo6rqf07aauatqv.png" alt=" " width="749" height="1079"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpy0rqoagu73i1hgja8yq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpy0rqoagu73i1hgja8yq.png" alt=" " width="750" height="1079"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Worth noting: both of these are tagged &lt;code&gt;knowledge-update&lt;/code&gt; in the dataset, not&lt;br&gt;
&lt;code&gt;temporal-reasoning&lt;/code&gt; the state-change pattern shows up across both&lt;br&gt;
categories, which is part of why treating them as one bucket loses&lt;br&gt;
information.)&lt;/p&gt;

&lt;p&gt;This is a clean test, and it's brutal for a common design. A memory system that resolves conflicts by recency - newest fact wins, older one is superseded answers the second question correctly and the first one wrong, by construction.&lt;/p&gt;

&lt;p&gt;A system that keeps only the first mention fails the reverse.&lt;/p&gt;

&lt;p&gt;Passing both requires storing both states with their timestamps and resolving which one the question is asking for.&lt;/p&gt;

&lt;p&gt;There are 44 questions in consecutive-ID pairs across the dataset. Not all are state-changes, but the pattern is deliberate.&lt;/p&gt;


&lt;h2&gt;
  
  
  Trap two: time-filtered disambiguation
&lt;/h2&gt;

&lt;p&gt;Not every temporal question is about a fact changing. Some are about picking the right event out of several similar ones.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0bc8ad92   "How many months have passed since I last visited a museum
            with a friend?"
           asked 2023/03/25 → answer: 5

0bc8ad93   "I mentioned visiting a museum two months ago. Did I visit
            with a friend or not?"
           asked 2023/03/11 → answer: "No, you did not visit with a friend."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are multiple museum visits in the history. Retrieving "museum visit" by semantic similarity isn't enough you have to filter by time window &lt;em&gt;and&lt;/em&gt; check an attribute (was a friend present) on the specific event that matches.&lt;/p&gt;

&lt;p&gt;Note these two have different answer sessions and question dates a fortnight&lt;br&gt;
apart. They aren't the same haystack asked twice; they're two instances of the&lt;br&gt;
same trap design.&lt;/p&gt;


&lt;h2&gt;
  
  
  Trap three: abstention decoys
&lt;/h2&gt;

&lt;p&gt;30 questions carry an &lt;code&gt;_abs&lt;/code&gt; suffix. They're near-identical to a real question,&lt;br&gt;
with one entity swapped for something that was never mentioned.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2698e78f       "How often do I see my therapist, Dr. Smith?"
2698e78f_abs   "How often do I see Dr. Johnson?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dr. Johnson doesn't exist in the conversation history. The ground truth:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The information provided is not enough. You mentioned seeing Dr. Smith but&lt;br&gt;
not Dr. Johnson.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wyg3pllk1g47zghch63.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9wyg3pllk1g47zghch63.png" alt=" " width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's not scoring whether a system returns null. It's scoring whether it can refuse &lt;em&gt;and explain the near-miss that probably caused the confusion&lt;/em&gt;. A system that pattern-matches "therapist" and confabulates a frequency fails. So does one that says only "I don't know."&lt;/p&gt;

&lt;p&gt;6% of the benchmark is testing reasoned refusal. That's a design decision worth noticing - abstention is treated as a first-class capability, not an edge case.&lt;/p&gt;




&lt;h2&gt;
  
  
  In a 10-question sample, arithmetic outnumbers retrieval about 2:1
&lt;/h2&gt;

&lt;p&gt;I pulled ten temporal-reasoning questions and checked their answer formats&lt;br&gt;
directly against the source JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;08f4fc43   30 days. 31 days (including the last day) is also acceptable.
0bb5a684   7 days. 8 days (including the last day) is also acceptable.
0db4c65d   18 days. 19 days (including the last day) is also acceptable.
2a1811e2   21 days. 22 days (including the last day) is also acceptable.
2c63a862   14 days. 15 days (including the last day) is also acceptable.
5e1b23de   3
d01c6aa8   27

2ebe6c92   'The Nightingale' by Kristin Hannah
4dfccbf8   I started taking ukulele lessons with Rachel.
71017277   my aunt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqneifcqoz5tkogncxapg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqneifcqoz5tkogncxapg.png" alt=" " width="800" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seven are computed date arithmetic. Three are retrieved facts filtered by a time&lt;br&gt;
window a 70/30 split in this sample. That's two genuinely different&lt;br&gt;
capabilities:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Date arithmetic&lt;/strong&gt;: find an event, extract its timestamp, subtract from the question date, express the difference in the right unit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Time-filtered retrieval&lt;/strong&gt;: find the specific event that falls in a stated window, then answer a question about it.&lt;/p&gt;

&lt;p&gt;A system could be excellent at one and poor at the other, and the category&lt;br&gt;
average would hide it entirely.&lt;/p&gt;

&lt;p&gt;I want to be honest about what this number is and isn't: it's a 10-question sample out of 133 temporal-reasoning questions, read by hand rather than pulled programmatically at scale running the full category costs API budget I didn't have for this pass. &lt;br&gt;
Take 70/30 as directional, not as a precise benchmark-wide&lt;br&gt;
ratio. The qualitative point that "temporal reasoning" bundles two different skills holds regardless of the exact split.&lt;/p&gt;

&lt;p&gt;The tolerance in those answers is worth noting too &lt;em&gt;"31 days (including the last day) is also acceptable."&lt;/em&gt; The dataset authors built in slack for off-by-one errors, which tells you they expected date arithmetic to be genuinely error-prone.&lt;/p&gt;


&lt;h2&gt;
  
  
  The retrieval problem underneath everything
&lt;/h2&gt;

&lt;p&gt;One more number that reframes all of this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0bc8ad92
  haystack sessions:  49
  answer sessions:     3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every question ships with roughly fifty conversation sessions. The answer lives in two or three of them. The rest are deliberate distractors unrelated chats about pitch decks, recipes, travel plans.&lt;/p&gt;

&lt;p&gt;That's a 6% signal-to-noise ratio &lt;em&gt;before any temporal reasoning happens&lt;/em&gt;. A system has to find three needles in fifty haystacks, and only then start&lt;br&gt;
reasoning about dates.&lt;/p&gt;

&lt;p&gt;So a failed temporal question could be a failure at any of three stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The right fact was never extracted from the conversation&lt;/li&gt;
&lt;li&gt;It was extracted but not retrieved&lt;/li&gt;
&lt;li&gt;It was retrieved but the temporal reasoning was wrong&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A single accuracy number can't distinguish them.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;If you're building a memory system, "we score 91% on temporal reasoning" isn't actionable. The 9% you're failing could be date arithmetic, disambiguation, state-change pairs, or retrieval and the fixes for those are completely different.&lt;/p&gt;

&lt;p&gt;If you're evaluating one, the same applies in reverse. Two providers with&lt;br&gt;
identical temporal scores could have opposite strength profiles.&lt;/p&gt;

&lt;p&gt;The obvious improvement is sub-scores: report arithmetic, retrieval, and&lt;br&gt;
state-change separately. The dataset already supports it the question types and ID patterns are right there.&lt;/p&gt;


&lt;h2&gt;
  
  
  What I'd want to know next
&lt;/h2&gt;

&lt;p&gt;The question I can't answer from the dataset alone: &lt;strong&gt;when a system fails a temporal question, where in the pipeline did it break?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Answering that means running a benchmark and then inspecting what was actually stored versus what the source said separating extraction failures from retrieval failures. That's a bigger piece of work and it needs real API budget.&lt;/p&gt;

&lt;p&gt;If someone's already done it, I'd like to read it.&lt;/p&gt;


&lt;h2&gt;
  
  
  Reproducing this
&lt;/h2&gt;

&lt;p&gt;Everything here is free to verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/supermemoryai/memorybench
&lt;span class="nb"&gt;cd &lt;/span&gt;memorybench
bun &lt;span class="nb"&gt;install

&lt;/span&gt;bun run src/index.ts list-questions &lt;span class="nt"&gt;-b&lt;/span&gt; longmemeval &lt;span class="nt"&gt;-t&lt;/span&gt; temporal-reasoning
bun run src/index.ts list-questions &lt;span class="nt"&gt;-b&lt;/span&gt; longmemeval &lt;span class="nt"&gt;-t&lt;/span&gt; knowledge-update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The dataset downloads on first use (265 MB) and splits into 500 individual&lt;br&gt;
question files under &lt;code&gt;data/benchmarks/longmemeval/datasets/questions/&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Read them directly that's where everything above came from.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I build &lt;a href="https://github.com/DataAlchmesit/MiniEval-pro" rel="noopener noreferrer"&gt;MiniEval&lt;/a&gt;, a faithfulness gate for AI memory. It works on the extraction step -checking&lt;br&gt;
whether a stored fact is faithful to the message it came from which is one&lt;br&gt;
layer beneath what this benchmark measures. I went looking at LongMemEval to understand how the field evaluates memory, and found the category structure more interesting than the scores.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>opensource</category>
      <category>datascience</category>
    </item>
  </channel>
</rss>
